0

私はをFormsAuthenticationクッキーのUserdataの中でそれを格納することができるようにシリアライズすることができるようにしたいカスタムプリンシパルオブジェクトを持っています。私はこれを行うDataContractJsonSerializerを使用しようとしているが、シリアル化が発生したときに私は空の文字列(例外なし)を取得します。SerializeをカスタムPrincipalオブジェクト

[DataContract] 
public class MyPrincipal : IPrincipal 
{ 
    private readonly MyIdentity _identity; 

    public MyPrincipal(MyIdentity identity) 
    { 
     _identity = identity; 
    } 

    [DataMember] 
    public IIdentity Identity 
    { 
     get { return _identity; } 
     set { } 
    } 

    public bool IsInRole(string role) 
    { 
     return _identity.AuthGroups.Contains(role, StringComparer.OrdinalIgnoreCase); 
    } 

    public bool IsInRole(string[] roles) 
    { 
     return roles.Any(IsInRole); 
    } 
} 

[DataContract] 
public class MyIdentity : IIdentity 
{ 
    private readonly MyCustomData _customData; 

    public MyIdentity(MyCustomData customData) 
    { 
     _customData = customData; 
    } 

    #region IIdentity properties 

    [DataMember] 
    public string Name 
    { 
     get { return Username; } 
     set {} 
    } 

    [DataMember] 
    public string AuthenticationType 
    { 
     get { return "Forms"; } 
     set {} 
    } 

    [DataMember] 
    public bool IsAuthenticated 
    { 
     get { return true; } 
     set { } 
    } 

    #endregion 

    #region custom properties 

    [DataMember] 
    public string FirstName 
    { 
     get { return _customData.FirstName; } 
     set { } 
    } 
    [DataMember] 
    public string LastName 
    { 
     get { return _customData.LastName; } 
     set { } 
    } 
    [DataMember] 
    public string RedwoodID 
    { 
     get { return _customData.CedarnetRedwoodID; } 
     set { } 
    } 
    [DataMember] 
    public string Username 
    { 
     get { return _customData.NetworkLogin; } 
     set { } 
    } 
    [DataMember] 
    public string CuwasTicket 
    { 
     get { return _customData.CuwasTicket; } 
     set { } 
    } 
    [DataMember] 
    public List<string> AuthGroups 
    { 
     get { return _customData.GroupMembership; } 
     set { } 
    } 

    #endregion 
} 

そして、ここで私はそれをすべてseralizeするために実行しようとしているコードです:

var serializer = new DataContractJsonSerializer(typeof(MyPrincipal), new List<Type> {typeof(MyPrincipal), typeof(MyIdentity)}); 
var responseStream = new MemoryStream(); 
serializer.WriteObject(responseStream, user); 
string serializedValue = new StreamReader(responseStream).ReadToEnd(); 

答えて

1

あなたは1行欠場:

serializer.WriteObject(responseStream, user); 
responseStream.Position = 0; // This!! 
string serializedValue = new StreamReader(responseStream).ReadToEnd(); 

serializerを覚えて、ストリームとStreamReader開始に書き込みストリームの終わりである現在の位置から

別の注記では、IPrincipalIIdentityをシリアル化するのは良いことではありません。理由は、それらがいつでも変更できる揮発性の状態(例えば、シリアル化の後に取り消された許可)を表す理由である。

+0

うわー、恥ずかしい。ありがとう。 – Kyle

+0

あまり恥ずかしいです。よくある間違い - 私はそれも難しい方法を学んだ。 – Aliostad

+0

私はしばらくこのベストプラクティスに苦労しました。私はセッションでPrincipalオブジェクトをキャッシュしていましたが、これは悪い考えのようです。私はかなりフォーム認証の新しいです。本当にこれを行う最良の方法は何ですか? – Kyle