从Visual Studio的“Web API”项目模板开始,我尝试向/Api/Account/ExternalLogin
端点创建的令牌添加自定义声明。我通过FacebookAuthenticationProvider.OnAuthenticated
回调添加了这些内容,但它们不会持续到OAuthAuthorizationServerProvider.AuthorizationEndpointResponse()
。
注意:我正在使用Rahul Nath在他的文章ASP.NET Web API and External Login - Authenticating with Social Networks 中记录的类似方法
在我的Startup.Auth.cs
类的ConfigureAuth()
方法(从OwinStartup
类的Configuration()
方法调用)中,我向OnAuthenticated
属性中添加了一个回调函数要设置单个声明foo
,请使用值bar
:
var facebookAuthenticationProvider = new FacebookAuthenticationProvider() {
OnAuthenticated = (context) => {
context.Identity.AddClaim(new Claim("foo", "bar"));
return Task.FromResult(0);
}
};
然后我将FacebookAuthenticationProvider
实例添加到新的FacebookAuthenticationOptions
对象:
var facebookAuthenticationOptions = new FacebookAuthenticationOptions() {
AppId = "XXXX",
AppSecret = "YYYY",
Provider = facebookAuthenticationProvider
};
并将其传递给OWIN的UseFacebookAuthentication()
方法:
app.UseFacebookAuthentication(facebookAuthenticationOptions);
如果我在OnAuthenticated
回调中添加断点,我可以看到我的自定义声明正在添加,其他一些声明(包括来自urn:facebook
命名空间的一对声明)也是如此。到目前为止一切都很好。
但是,当我在Facebook身份验证后通过AuthorizationEndpointResponse()
课程的OAuthAuthorizationServerProvider
方法检查我的声明时,context.Identity.Claims
集合中只有两个声明:
我的自定义urn:facebook
声明已删除所有foo
声明。我假设管道中的其他位置正在使用准确的声明来重新创建声明,但我不确定在哪里。
思想?
答案 0 :(得分:0)
我有以下用于访问自定义声明的代码:
public class AppUser : ClaimsPrincipal{
public AppUser(ClaimsPrincipal principal): base(principal){}
public string Role{
get{
return this.FindFirst(ClaimTypes.Role).Value;
}
}
public string ProfileID{
get{
return this.FindFirst("ProfileID").Value;
}
}
}
答案 1 :(得分:0)
您可能需要编辑ExternalLoginData私有类以包含要在流中传递的其他声明。在默认的VS2013模板类文件中,可以在AccountController.cs文件中找到此私有类。
我遇到了类似的问题,无法通过Google声明传递电子邮件,这解决了问题(请注意添加的"电子邮件"变量及其在两种方法中的引用:
private class ExternalLoginData
{
public string LoginProvider { get; set; }
public string ProviderKey { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public IList<Claim> GetClaims()
{
IList<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, ProviderKey, null, LoginProvider));
if (UserName != null)
{
claims.Add(new Claim(ClaimTypes.Name, UserName, null, LoginProvider));
}
if (Email != null)
{
claims.Add(new Claim(ClaimTypes.Email, Email, null, LoginProvider));
}
return claims;
}
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),
Email = identity.FindFirstValue(ClaimTypes.Email)
};
}
}