我在带有表单身份验证的 ASP.NET 框架内使用自定义成员资格和角色提供程序。这些工作很好。角色提供者使用 cookie 来持久化角色,从而在每个 Web 请求上保存到数据库的行程。我还在 FormsAuthenticationTicket 中使用 UserData 字符串来存储 UserId。
我需要将我的 DAL 从 Web 项目中重构为自己的项目。DAL 依赖于检索当前用户的 ID 以及检查角色的权限。我的身份验证系统应该如何更改,以便我可以使用 Thread.CurrentPrincipal 而无需在 DAL 项目中引用 System.Web?
目前,Provider Framework 创建一个 RolePrincipal 和 FormsIdentity 对象并将其附加到 Thread.CurrentPrincipal。
我考虑过在 Application_PostAuthenticateRequest 事件期间围绕 RolePrincipal 创建一个自定义 IPrincipal 包装器。在这种情况下,我可以从 FormsAuthenticalTicket 中获取 UserID,并将其与 RolePrincipal 一起传递给这个新的 wrapperPrincipal。
这是一种有效的方法吗?我最终会因为弄乱 Provider 结构而在项目中导致一些问题吗?
谢谢你,基思
protected void Application_PostAuthenticateRequest()
{
if (Request.IsAuthenticated)
{
FormsIdentity identity = (FormsIdentity)User.Identity;
if (identity != null)
{
FormsAuthenticationTicket ticket = identity.Ticket;
int id = 1;
if (identity != null)
{
int.TryParse(identity.Ticket.UserData, out id);
}
var wrapperPrincipal = new WrapperPrincipal(User, id);
System.Threading.Thread.CurrentPrincipal = WrapperPrincipal;
}
}
}
[Serializable]
public class WrapperPrincipal : IPrincipal
{
private IPrincipal principal;
public WrapperPrincipal(IPrincipal principal, int userId)
{
this.principal = principal;
this.Id = userId;
}
public int Id { get; set; }
public IIdentity Identity
{
get { return principal.Identity; }
}
public bool IsInRole(string role)
{
return principal.IsInRole(role);
}
}