为什么我运行我的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);
答案 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”,然后处置返回的对象将成为调用者的责任。