WebApi 2 OAuth外部登录访问令牌问题

时间:2016-02-03 10:05:30

标签: c# asp.net angularjs asp.net-web-api oauth

我一直在关注webapi oauth登录的教程;

http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/

一切运行顺利,但我很难检索从外部提供商发回的令牌(在此测试用例中为Google)。

因此,在用户通过身份验证数据验证并确认第二次登录“ExternalLogin”结束点后,在webapi上进行了登录。

在此方法中,它调用以下内容将所有数据提取到类

ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);

它在这里似乎正在倒下。当它调用FromIdentity方法时;

   public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
    {
        if (identity == null)
        {
            return null;
        }

        Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);

        if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer) || String.IsNullOrEmpty(providerKeyClaim.Value))
        {
            return null;
        }

        if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
        {
            return null;
        }

        return new ExternalLoginData
        {
            LoginProvider = providerKeyClaim.Issuer,
            ProviderKey = providerKeyClaim.Value,
            UserName = identity.FindFirstValue(ClaimTypes.Name),
            ExternalAccessToken = identity.FindFirstValue("ExternalAccessToken"),
        };
    }

线;

ExternalAccessToken = identity.FindFirstValue("ExternalAccessToken")

返回null?我无法在任何索赔中看到此令牌?

1 个答案:

答案 0 :(得分:1)

ExternalAccessToken 是添加的自定义声明。请检查以下代码,该代码从默认提供程序扩展。

对于Google

 public class GoogleAuthProvider : IGoogleOAuth2AuthenticationProvider
    {
        public void ApplyRedirect(GoogleOAuth2ApplyRedirectContext context)
        {
            context.Response.Redirect(context.RedirectUri);
        }

        public Task Authenticated(GoogleOAuth2AuthenticatedContext context)
        {
            context.Identity.AddClaim(new Claim("ExternalAccessToken", context.AccessToken));
            return Task.FromResult<object>(null);
        }

        public Task ReturnEndpoint(GoogleOAuth2ReturnEndpointContext context)
        {
            return Task.FromResult<object>(null);
        }
    }

对于Facebook

public class FacebookAuthProvider : FacebookAuthenticationProvider
    {
        public override Task Authenticated(FacebookAuthenticatedContext context)
        {
            context.Identity.AddClaim(new Claim("ExternalAccessToken", context.AccessToken));
            return Task.FromResult<object>(null);
        }
    }

在这些课程中,使用以下行添加了声明;

context.Identity.AddClaim(new Claim("ExternalAccessToken", context.AccessToken));