0

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 プロパティへのアクセス。

どんな援助でも大歓迎です。

ありがとう

マット

4

2 に答える 2

1

これは、このように動作するようには設計されていません。クレームはタプルであり、それ以上のものではありません。

于 2013-09-14T05:48:19.793 に答える