【问题标题】:Serialize Custom Principal object序列化自定义主体对象
【发布时间】:2012-03-22 15:27:46
【问题描述】:

我有一个自定义主体对象,我希望能够对其进行序列化,以便可以将其存储在 FormsAuthentication cookie 的 Userdata 中。我正在尝试使用 DataContractJsonSerializer 来执行此操作,但是当序列化发生时,我只会得到一个空字符串(没有例外)。

[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
}

这是我尝试运行的代码以将其全部序列化:

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();

【问题讨论】:

    标签: .net serialization forms-authentication datacontractserializer


    【解决方案1】:

    你漏掉了一行:

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

    记住serializer 写入流,StreamReader 从流结束的当前位置开始。

    另外,序列化IPrincipalIIdentity 看起来不是一件好事。原因是它们代表了一个不稳定的状态,可以随时更改(例如,在序列化后撤销权限)。

    【讨论】:

    • 不太尴尬。一个常见的错误——我也很难学会。
    • 我已经在这方面的最佳实践中苦苦挣扎了一段时间。我曾经在会话中缓存 Principal 对象,但这似乎也是一个坏主意。我对表单身份验证相当陌生。真正做到这一点的最佳方法是什么?
    • 保持会话仍然比制作 cookie 更好,因为它容易在客户端被篡改。如果性能不受影响,请不要将其保留在会话中,因为如果权限发生更改,您必须重新加载它并使您的解决方案更加脆弱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2014-03-03
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多