【发布时间】:2015-06-27 21:55:10
【问题描述】:
我正在使用 ASP.Net Identity 来实现外部登录。用户使用谷歌登录后,我得到谷歌的外部访问令牌。然后我对ObtainLocalAccessToken() 进行第二次 api 调用,它将外部访问令牌换成新的本地令牌。
ObtainLocalAccessToken() 调用 VerifyExternalAccessToken(),后者通过手动进行 http 调用并解析 user_id 来向提供者验证外部访问令牌。
如何利用 ASP.NET 标识来删除整个方法 VerifyExternalAccessToken()?
我相信这就是[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] 的用途,不是吗?我想用该属性装饰ObtainLocalAccessToken()端点并在标头({'Authorization' : 'Bearer xxx' })中发送external_access_token,它应该填充User.Identity而不需要手动验证外部访问令牌?我相信这是目的,但我无法让它发挥作用。我从 google 发送了一个有效的外部访问令牌,但它被 401 拒绝。
顺便说一句,我在 Startup.Auth 中有这一行:
app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(),
AuthorizeEndpointPath = new PathString("/AccountApi/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
});
或者,是否可以使用“/Token”端点将外部访问令牌换成本地访问令牌?哪种方法是正确的?
【问题讨论】:
-
我会在这里做一个疯狂的猜测。但是我从谷歌使用的每一项服务都是通过 https 进行的。您可能无法使用 AllowInsecureHttp = true 吗?由于您的错误是 401,我很确定这意味着不允许调用 http。
-
好吧,我还不能使用 ssl,所以我需要它来使用 http,就像它在我的 Web 应用程序(但不是来自移动设备)中一样。但是我是否正确理解 [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] 应该在发送外部访问令牌时填充原则?如果是这样,它如何知道访问令牌来自哪个提供者?
-
除此之外 401 = 未经授权。 “此请求的授权已被拒绝。”
标签: c# oauth-2.0 asp.net-identity asp.net-identity-2