验证访问令牌 - Asp.Net标识

时间:2015-06-27 21:55:10

标签: c# oauth-2.0 asp.net-identity asp.net-identity-2

我正在使用ASP.Net Identity来实现外部登录。用户登录Google后,我会获得谷歌的外部访问令牌。然后我对ObtainLocalAccessToken()进行第二次api调用,该调用将外部访问令牌换成新的本地访问令牌。

ObtainLocalAccessToken()调用VerifyExternalAccessToken(),通过手动进行http调用和解析user_id来验证提供者的外部访问令牌。

如何利用ASP.NET身份删除整个方法VerifyExternalAccessToken()

我相信[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]的用途不是吗?我想用该属性修饰ObtainLocalAccessToken()端点并在标头({'Authorization' : 'Bearer xxx' })中发送external_access_token,它应该填充User.Identity而无需手动验证外部访问令牌?我相信这是目的,但我不能让它发挥作用。我从谷歌发送了一个有效的外部访问令牌,它被401拒绝。

我在Startup.Auth btw中有这一行:

 app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(),
            AuthorizeEndpointPath = new PathString("/AccountApi/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        });

或者,可以使用“/ Token”端点来交换本地端口的外部访问令牌?哪种方法是正确的?

1 个答案:

答案 0 :(得分:5)

研究Taiseer Joudeh的实施

/ExternalLogin端点取代 OWIN身份验证挑战

AngularJS LoginController在身份提供商中找不到外部认证用户时调用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');

使用 VerifyExternalAccessToken Google Facebook 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中间件使用外部承载令牌访问第三方Cookie并注册一个新帐户(或找到现有的)。

OWIN中间件无法配置为接受外部承载令牌而非本地授权令牌。 外部承载令牌仅用于身份验证和注册。