使用复杂类型的自定义声明未正确反序列化

本文关键字:反序列化 声明 自定义 复杂 类型 | 更新日期: 2023-09-27 18:31:06

我在 ASP.NET MVC 4.5应用程序中使用声明身份验证。我遵循所有标准模式,并且运行良好。但是,我刚刚注意到使用复杂类型的自定义声明未正确反序列化。

我有一个自定义声明如下:(角色是一个枚举,但已将其更改为 long 以简化事情)

[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,我无法访问ClientId和Role属性。

任何协助将不胜感激。

谢谢

使用复杂类型的自定义声明未正确反序列化

这不是为这样工作而设计的。声明是元组,仅此而已。

使用自定义声明类型和结构化资源类型创建声明 http://msdn.microsoft.com/en-us/library/ms734687(v=vs.110).aspx