System.DirectoryServices.AccountManagement.UserPrincipal - localhost但不是iis

时间:2012-06-21 12:40:08

标签: asp.net impersonation userprincipal

为什么我运行我的Web应用程序localhost时,下面的代码工作正常,但是当我将它安装到IIS服务器时却没有?

using (HostingEnvironment.Impersonate())
{
    UserPrincipal activeUser = UserPrincipal.Current;
    String activeUserSid = activeUser.Sid.ToString();
    String activeUserUPN = activeUser.UserPrincipalName;
}

请不要建议我坚持使用HttpContext.Current.User,因为如果没有对Active Directory的额外调用,它就无法访问SID或UPN。

Web应用程序将由来自三个不同域的Windows身份验证用户使用,Web服务器托管在第四个域中。应用程序池配置为在NetworkService标识下运行,并且Web应用程序配置将标识模拟设置为true。

在IIS上运行时的错误消息是:

  

Page_Load()中的错误:UserPrincipal.Current   System.InvalidCastException:无法转换类型的对象   键入'System.DirectoryServices.AccountManagement.GroupPrincipal'   'System.DirectoryServices.AccountManagement.UserPrincipal'。
  在System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext)   context,IdentityType identityType,String identityValue)
  在System.DirectoryServices.AccountManagement.UserPrincipal.get_Current()
  at webapp.Details.Default.Page_Load(Object sender,EventArgs e)

修改: 试过以下两个,不幸的是得到了同样的错误。

UserPrincipal userPrincipal = UserPrincipal.Current;
Response.Write(userPrincipal.Name);
Principal userOrGroup = UserPrincipal.Current;
Response.Write(userOrGroup.Name);

3 个答案:

答案 0 :(得分:4)

我在部署UserPrincipal.Current时遇到了很多问题,但仍然没有完全理解原因。

我终于最终使用了PrincipalSearcher,并创建了以下函数来执行我认为UserPrincipal.Current正在做的事情。

private UserPrincipal GetActiveDirectoryUser(string userName)
{
    using(var ctx = new PrincipalContext(ContextType.Domain))
    using(var user = new UserPrincipal(ctx) { SamAccountName = userName})
    using(var searcher = new PrincipalSearcher(user))
    {
        return searcher.FindOne() as UserPrincipal;
    }
}

我将System.Web.HttpContext.Current.User.Identity.Name作为userName传递给该方法。

答案 1 :(得分:2)

似乎需要一些其他方法来确定用户 这里描述来自msdn的财产:
“获取一个用户主体对象,该对象表示运行该线程的当前用户。”
因此,UserPrincipal.Current在IIS运行的情况下返回用户。

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.userprincipal.aspx

答案 2 :(得分:0)

是的,这是因为由于多个using语句,您正在处理返回的UserPrincipal对象。从using语句中删除“ ctx”,然后处置返回的对象将成为调用者的责任。