自定义IPrincipal和WindowsAuthentication

时间:2009-03-12 21:00:56

标签: asp.net authentication windows-authentication

有没有将ASP.NET Windows身份验证与自定义IPrincipal / IIdentity对象相结合的好方法?我需要存储用户的电子邮件地址,并使用我在AuthenticateRequest事件期间添加到Context.CurrentUser的自定义IIdentity / IPrincipal对进行表单身份验证。

我最好如何使用WindowsAuthentication完成此任务?

2 个答案:

答案 0 :(得分:3)

也许您可以将“ExtendedWindowsPrincipal”创建为基于WindowsPrincipal的派生类,只需将您的额外数据添加到派生类中?

这样,您的ExtendedWindowsPrincipal仍然可以在需要WindowsPricinpal的任何地方被识别。

或者:因为您正在谈论使用Windows身份验证,您可能在Windows网络中 - 某处有Active Directory或用户数据库,您可以在其中查找您感兴趣的电子邮件地址而不是将其存储在校长?

马克

答案 1 :(得分:3)

我最终重构了我最初的解决方案来替换Principal而不是我最初想到的身份。替换身份证明很麻烦,因为我在创建新的扩展WindowsPrincipal的实例时遇到了安全问题。

public class ExtendedWindowsPrincipal : WindowsPrincipal
{
    private readonly string _email;

    public ExtendedWindowsPrincipal(WindowsIdentity ntIdentity, 
       string email) : base(ntIdentity)
    {
            _email = email;
    }

    public string Email
    {
        get { return _email; }
    }
}

在我的身份验证模块中,我替换了HttpContext上的主体,如下所示:

var currentUser = (WindowsIdentity)HttpContext.Current.User.Identity;
HttpContext.Current.User = 
    new ExtendedWindowsPrincipal(currentUser, userEmail);