【问题标题】:Verify Access Token - Asp.Net Identity验证访问令牌 - Asp.Net 身份
【发布时间】: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


【解决方案1】:

Taiseer Joudeh 研究实现

/ExternalLogin 端点替换了 OWIN 身份验证挑战

AngularJSLoginController 在身份提供程序中未找到经过外部身份验证的用户时调用authService.obtainAccessToken

        if (fragment.haslocalaccount == 'False') {
           ...
        }

        else {
            //Obtain access token and redirect to orders
            var externalData = { provider: fragment.provider,
                      externalAccessToken: fragment.external_access_token };
            authService.obtainAccessToken(externalData).then(function (response) {

                $location.path('/orders');

它使用 VerifyExternalAccessTokenGoogleFacebook API 执行反向查找,以获取不记名令牌的声明信息。

        if (provider == "Facebook")
        {
            var appToken = "xxxxxx";
            verifyTokenEndPoint = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", accessToken, appToken);
        }
        else if (provider == "Google")
        {
            verifyTokenEndPoint = string.Format("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={0}", accessToken);
        }
        else
        {
            return null;
        }

如果找到令牌,则返回一个新的ASP.NET不记名令牌

        var accessTokenResponse = GenerateLocalAccessTokenResponse(user.UserName);

        return Ok(accessTokenResponse);

[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] OWIN 中间件 使用外部不记名令牌 访问第 3 方的 Cookie 并注册一个新帐户(或查找现有)。

OWIN 中间件 不能配置为接受外部不记名令牌 而不是本地授权令牌。 外部不记名令牌仅用于身份验证和注册。

【讨论】:

  • 嗨,戴夫,OWIN 中间件中是否有其他解决方案或方法,或者可以调用其他方法来验证外部提供者令牌? VerifyExternalAccessToken() 的自定义逻辑感觉很老套/重新发明轮子,因为每次我想添加新的外部提供程序时,该方法都需要更新。例如。推特。谢谢!
  • 确实,@GFoley83,VerifyExternalAccessToken() 是一个黑客。并且 OWIN 确实采用了使用 OAuth cookie 的方法。但没有用于消费身份验证令牌。要获取 OAuth 不记名令牌背后的 ID,您必须听从提供者的摆布。
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 2023-03-17
  • 2019-04-28
  • 2014-12-17
  • 2014-03-12
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多