我在ASP.NET MVC 4.5应用程序中使用声明身份验证。我正在遵循所有标准模式,并且运行良好。但是我刚才注意到使用复杂类型的自定义声明没有被正确反序列化。
我有一个自定义声明,如下所示:(角色是一个枚举,但已将其改为长篇以简化事物)
[DataContract(Name = "ClientRoleClaim", Namespace = "MyCompany.MyApplication.Security.Claims")]
public sealed class ClientRoleClaim : System.IdentityModel.Claims.Claim
{
public ClientRoleClaim(Guid clientId, Role role)
: base(MyAppClaimTypes.ClientRole, String.Empty, Rights.PossessProperty)
{
ClientId = clientId;
Role = (long)role;
}
[DataMember(Name = "ClientId")]
public Guid ClientId { get; set; }
[DataMember(Name = "Role")]
public long Role { get; set; }
}
仅供参考:MyAppClaimTypes.ClientRole只是一个带有const字符串属性的静态类。
在我的自定义ClaimsAuthenticationManager中,我创建了一个声明列表并添加了我的复杂ClientRoleClaim并创建了我的主体,如下所示:
// Create the claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
new Claim(ClaimTypes.Email, user.EmailAddress),
new ClientIdClaim(user.ClientEntityId),
new ClientRoleClaim(user.ClientEntityId, 1)
};
claimsIdentity = new ClaimsIdentity(claims, "Custom");
return new ClaimsPrincipal(claimsIdentity);
然后将令牌保持如下:
private void EstablishSession(ClaimsPrincipal newPrincipal)
{
var hours = Configuration.Configuration.GetSetting("SignIntPeriodInHours").ParseAs<int>().GetValueOrDefault(8);
var sessionToken = new SessionSecurityToken(newPrincipal, TimeSpan.FromHours(hours));
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
}
一切似乎都运行正常,但是当我随后尝试访问ClamsPrincipal.Current.Claims时,所有声明都存在,包括类型为MyAppClaimTypes.ClientRole的自定义声明,但它的类型为System.Security.Claims.Claim和I无法访问ClientId和Role属性。
非常感谢任何帮助。
由于
垫
答案 0 :(得分:1)
这不是为此而设计的。索赔是元组,仅此而已。
答案 1 :(得分:0)
使用自定义声明类型和结构化资源类型http://msdn.microsoft.com/en-us/library/ms734687(v=vs.110).aspx
创建声明