验证访问令牌 - Asp.Net 身份

Verify Access Token - Asp.Net Identity

我正在使用 ASP.Net Identity 来实现外部登录。用户使用 Google 登录后,我得到 google 的外部访问令牌。然后,我再次 api 调用 ObtainLocalAccessToken(),用外部访问令牌换取新的本地访问令牌。

ObtainLocalAccessToken() 调用 VerifyExternalAccessToken(),后者通过手动进行 http 调用并解析 user_id.

来验证提供商的外部访问令牌

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

我相信这就是 [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] 的目的,不是吗?我想用该属性装饰 ObtainLocalAccessToken() 端点并在 header ({'Authorization' : 'Bearer xxx' }) 中发送 external_access_token,它应该填充 User.Identity 而无需手动验证外部访问令牌?我相信这就是目的,但我无法让它发挥作用。我从 google 发送了一个有效的外部访问令牌,但它被 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”端点将外部访问令牌换成本地访问令牌吗?哪种做法是正确的?

学习 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');

它使用 VerifyExternalAccessTokenGoogle 执行反向查找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;
        }

如果找到令牌,它 returns 一个新的 ASP.NET 不记名令牌

        var accessTokenResponse = GenerateLocalAccessTokenResponse(user.UserName);

        return Ok(accessTokenResponse);

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

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