首页 文章

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

提问于
浏览
8

我'm using ASP.Net Identity to implement external logins. After user logins in with Google I get google'的外部访问令牌 . 然后我对ObtainLocalAccessToken()进行第二次api调用,该调用将外部访问令牌换成新的本地访问令牌 .

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

How can I leverage ASP.NET identity to remove the entire method VerifyExternalAccessToken()?

我相信 [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] 的用途不是吗?我想用该属性修饰 ObtainLocalAccessToken() endpoints 并在标头( {'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” endpoints 来交换本地端口的外部访问令牌?哪种方法是正确的?

1 回答

  • 5

    研究Taiseer Joudeh的实施情况

    /ExternalLogin endpoints 替换 OWIN Authentication Challenge .

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

    它使用 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 Middleware 使用外部承载令牌访问第三方的Cookie并注册新帐户(或查找现有帐户) .

    OWIN Middleware 无法配置为接受外部承载令牌而不是本地权限令牌 . 外部承载令牌仅用于身份验证和注册 .

相关问题