0

我在 MVC 4、ASP.NET 4.5 和 Windows 身份验证中有一个应用程序。我正在尝试扩展 Identity 和 Principal 对象(分别为 WindowsIdentity 和 WindowsPrincipal )以提供有关登录用户的其他信息,但是当我尝试创建这些对象的扩展实例并替换 Current.User 时,它会抛出一个错误:

System.UnauthorizedAccessException: "Attempted to perform an unauthorized operation." 

在我在 global.asax 中使用的代码下方:

public void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs args)
    {
        if (!args.Identity.IsAnonymous)
        {
            var userData = WindowsUserDataHelper.GetWindowsUserData(args.Identity);
            var user = new MyCustomPrincipal(new MyCustomIdentity(args.Identity.Name, userData));
            HttpContext.Current.User = user; //-- exception thrown here
            Thread.CurrentPrincipal = user;
        }
    }

这是 web.config 设置:

<authentication mode="Windows" >
</authentication>
<authorization>
    <deny users="?" />
</authorization>

在我的本地 IIS 中,我以这种方式设置了身份验证:

  • 匿名:已禁用
  • 基本:禁用
  • Windows 身份验证:已启用
  • 表单身份验证:已禁用
  • ASP.NET 模拟:已禁用
4

1 回答 1

2

这个问题给出了我的问题的解决方案:MVC3 Windows Authentication override User.Identity,在用户对自己的问题进行的编辑中。

基本上,总结一下:我在 event 中替换了 Principal public void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticateEventArgs args),并且我应该这样做protected void Application_AuthorizeRequest(object sender, EventArgs e)(这与 Forms Authentication 中的不同Application_AuthenticateRequest)。

Global.asax 中的代码最终是这样的:

protected void Application_AuthorizeRequest(object sender, EventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {
            var userData = WindowsUserDataHelper.GetWindowsUserData((WindowsIdentity)User.Identity);
            var user = new MyCustomPrincipal(new MyCustomIdentity(User.Identity.Name, userData));
            HttpContext.Current.User = user;
            Thread.CurrentPrincipal = user;
        }
    }

从这里开始,用户被替换为主体的扩展版本,应用程序的其余部分可以从任何地方(视图、控制器等)使用它。

于 2014-04-11T22:14:50.360 回答