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

C# 验证访问令牌-Asp.Net标识,c#,oauth-2.0,asp.net-identity,asp.net-identity-2,C#,Oauth 2.0,Asp.net Identity,Asp.net Identity 2,我正在使用ASP.Net标识实现外部登录。用户登录谷歌后,我得到谷歌的外部访问令牌。然后,我进行第二个api调用,将外部访问令牌交换为新的本地令牌 ObtainLocalAccessToken()调用,该调用通过手动进行http调用并解析用户id,向提供程序验证外部访问令牌 如何利用ASP.NET标识删除整个方法VerifyExternalAccessToken()? 我相信这就是[HostAuthentication(DefaultAuthenticationTypes.ExternalBea

我正在使用ASP.Net标识实现外部登录。用户登录谷歌后,我得到谷歌的外部访问令牌。然后,我进行第二个api调用,将外部访问令牌交换为新的本地令牌

ObtainLocalAccessToken()
调用,该调用通过手动进行http调用并解析用户id,向提供程序验证外部访问令牌

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

我相信这就是
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
的目的,不是吗?我想用该属性修饰
ObtainLocalAccessToken()
端点,并在头中发送外部访问令牌(
{'Authorization':'Bearer xxx'}
),它应该填充
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的实施

端点将替换OWIN身份验证质询

当在身份提供程序中未找到外部身份验证用户时,AngularJS
LoginController
调用:

        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');
它使用GoogleFacebookAPI执行反向查找,以获取承载令牌的索赔信息

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


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

我将在这里进行粗略猜测。但我从谷歌使用的每一项服务都是通过https。是否可能无法使用AllowInsecureHttp=true?由于您的错误是401,我很确定这意味着不允许调用http。我还不能使用ssl,所以我需要它使用http工作,就像我的web应用程序(但不是移动应用程序)中一样。但是我的理解正确吗?[HostAuthentication(DefaultAuthenticationTypes.ExternalBearner)]应该在发送外部访问令牌时填充原则?如果是,它如何知道访问令牌来自哪个提供商?除了401=未授权之外。“此请求的授权已被拒绝。”嗨,Dave,OWIN中间件中是否内置了其他解决方案或方法,或者可以调用其他方法来验证外部提供者令牌?
VerifyExternalAccessToken()
的自定义逻辑让人感觉有点刻薄/重新发明轮子,因为每次我想添加新的外部提供程序时,该方法都需要更新。例如推特。谢谢事实上,@GFoley83,
VerifyExternalAccessToken()。OWIN确实有烘焙方法来食用OAuth饼干。但没有一个用于消费身份验证令牌。要获得OAuth承载令牌背后的ID,您需要由提供者决定。