我一直在关注webapi oauth登录的教程;
一切运行顺利,但我很难检索从外部提供商发回的令牌(在此测试用例中为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?我无法在任何索赔中看到此令牌?
答案 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));