我有下面的代码,它完美无缺,但是当我在IIS中部署它时,它不起作用。
DirectoryEntry de = new DirectoryEntry("WinNT://" + Environment.UserDomainName + "/" + Environment.UserName);
return de.Properties["fullName"].Value.ToString();
任何帮助将不胜感激。
答案 0 :(得分:1)
Environment包含有关服务器上环境的信息,因此您只需获取运行Web应用程序的进程的用户名。那不是你想要的。
相反,您应该使用User.Identity.Name
来检索用户的用户名,然后您可以使用它来从AD获取用户的名称。
答案 1 :(得分:1)
根据.Net 4.5建议,您应始终使用ClaimsPrincipal。我正在给你一个以下程序示例,我刚刚通过控制台应用程序运行它并且它运行良好。
我在这里使用了一个扩展方法,并附加到claimprincipal,然后现在可以访问任何地方。
private static void Main(string[] args)
{
var fullName = ClaimsPrincipal.Current.GetFullName();
}
public static string GetFullName(this ClaimsPrincipal principal)
{
if (!principal.HasClaim(claim => claim.Type == ClaimTypes.Surname) ||
!principal.HasClaim(claim => claim.Type == ClaimTypes.GivenName))
{
var dcUsername = principal.Identity;
// get the value from dc.
var de = new DirectoryEntry("WinNT://" + dcUsername);
var claims = new List<Claim> {new Claim(ClaimTypes.GivenName, ""), new Claim(ClaimTypes.Surname, "")};
var id = principal.Identities.First();
id.AddClaims(claims);
}
var givenName = principal.FindFirst(ClaimTypes.GivenName).Value;
var surname = principal.FindFirst(ClaimTypes.Surname).Value;
return string.Format("{0} {1}", givenName, surname);
}
答案 2 :(得分:0)
Environment.UserName
通常在IIS上托管时返回ApplicationPool用户。尝试使用HttpContext.User.Identity.Name
获取域名用户名。
例如,
string userName = HttpContext.User.Identity.Name;
DirectoryEntry de = new DirectoryEntry("WinNT://" + userName);
return de.Properties["fullName"].Value.ToString();
答案 3 :(得分:0)
如果在域上下文中使用Windows身份验证,则此解决方案在调试器中以及部署到IIS以获取当前用户的名字/姓氏时均应适用。首先添加对System.DirectoryServices.AccountManagement的引用。
string currentUserID = HttpContext.Current.User.Identity.Name;
using (PrincipalContext adContext = new PrincipalContext(ContextType.Domain))
{
UserPrincipal currentUser = UserPrincipal.FindByIdentity(adContext, currentUserID);
return string.Format("{0} {1}", currentUser.GivenName, currentUser.Surname);
}