使用LogonUser后出现UnauthorizedAccessException

时间:2012-07-20 21:42:27

标签: asp.net .net asp.net-mvc windows authorization

我正在覆盖Application_AuthenticateRequest,以便通过调用LogonUser以编程方式检索的另一个用户替换Windows身份验证用户。当我将生成的WindowsPrinciple分配给Context.User 时,我得到以下异常。我的开发机器上没有这个例外(一切都很完美),只在我的QA机器上。这两台机器都是Windows Server 2008 R2。 QA机器上有些不同,但我不知道它是什么。

以下是我要完成的full description

    [UnauthorizedAccessException: Attempted to perform an unauthorized operation.]
   System.Security.Principal.WindowsIdentity.get_AuthenticationType() +317
   System.Web.Hosting.IIS7WorkerRequest.SetPrincipal(IPrincipal user, IntPtr pManagedPrincipal) +106
   System.Web.HttpContext.SetPrincipalNoDemand(IPrincipal principal, Boolean needToSetNativePrincipal) +9022044
   System.Web.HttpContext.SetPrincipalNoDemand(IPrincipal principal) +6
   System.Web.HttpContext.set_User(IPrincipal value) +36
   MyProj.MvcApplication.OverrideLoginUser() in C:\Data\Project\MyProj\Global.asax.cs:317
   MyProj.MvcApplication.Application_AuthenticateRequest(Object sender, EventArgs e) in C:\Data\Project\MyProj\Global.asax.cs:305
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

更新

我通过将应用程序池的标识从“ApplicationPoolIdentity”更改为“LocalSystem”来解决QA计算机上的错误。在我的开发框中,设置是ApplicationPoolIdentity,那么为什么权限不同?失败的功能需要什么权限?

更新2

我已经筋疲力尽了。即使在本地Administrators组中使用用户帐户也无济于事。唯一可行的是将应用程序池作为LocalSystem运行。其他一些人也有这个问题(documented here)任何想法都值得赞赏。感谢。

1 个答案:

答案 0 :(得分:3)

确定。它花了我5个小时,但我找到了解决方案。在将主体对象分配给Identity.AuthenticationType之前,我通过调用新创建的标识的属性将问题缩小到Context.User调用。这次我的Dev盒子上也发现了未经授权的错误。我想这意味着由于某种原因,在Context.User分配期间,我的开发箱上没有执行该属性,但是在我的QA框中执行了该属性。无论如何,在谷歌搜索后,我发现this documentation显示了如何在WindowsIdentity构造期间指定AuthenticationType。我这样做后,我的问题解决了!这是代码:

// Construct a WindowsIdentity object using the input account token 
// and the specified authentication type.
var foo = new WindowsIdentity(logonToken, "WindowsAuthentication");

就是这样!我的两台服务器上都没有更多身份验证错误!