事情是这样的:有一套ASP.NET应用程序,用户一般会用工号登录,但是我们希望在应用程序中方便地访问到该用户相关的其他信息,例如用户名或者工厂名称。
按照标准的ASP.NET Membership的做法,它不能提供这样的信息。Page.User.Identity.Name只是返回用户登录时使用的名称,在本例中是工号。
我们的目标是,能不能实现Page.User.Identity.Name显示用户的真实名称,而不是工号,甚至还可以显示其他的一些信息。
要实现这样的功能,我的思路是自定义身份验证。下面就是我的步骤,可以供大家参考
第一步:自定义Identity
Identity在安全设计中很重要,他一般代表了用户标识。本例中,我们添加了几个特殊的属性
public class SECIdentity : IIdentity
{
public string DisplayName { get; set; }
public string Factory { get; set; }
public string Name { get; set; }
public string AuthenticationType
{
get { return "Custom Authentication"; }
}
public bool IsAuthenticated
{
get { return true; }
}
public override string ToString()
{
return string.Format("{0},{1}", Factory, DisplayName);
}
}
第二步:自定义Principal
一个用户不仅需要有名称等基本信息,它还应该具有另外一些信息,例如角色等等。这可以通过封装成一个Principal来解决
public class SECPrincipal : IPrincipal
{
public SECPrincipal(string name, string displayName, string factory)
{
identity = new SECIdentity()
{
Name = name,
DisplayName = displayName,
Factory = factory
};
}
private IIdentity identity;
public IIdentity Identity
{
get
{
return identity;
}
}
public bool IsInRole(string role)
{
return true;
}
}