所以这就是我试图做的事情:
我想使用Windows身份验证来保护ASP.NET应用程序上的特定虚拟目录。虚拟目录只有一个文件default.aspx。在代码隐藏中,我只想获取登录用户的Windows用户名,但无论我使用什么属性,它都会返回应用程序的安全上下文。
我需要网站本身在" AppContext"的上下文中运行。但是,要确定用户是否有权访问该站点,我需要使用该用户的Windows域凭据。
IIdentity windowsIdentity = WindowsIdentity.GetCurrent();
logger.Info("Windows username: " + windowsIdentity.Name);
logger.Info("System.Environment.Username: " + System.Environment.UserName);
logger.Info("HttpContext: " + HttpContext.Current.User.Identity.Name);
输出结果为:
Windows username: DOMAIN\AppContext
System.Environment.Username: AppContext
HttpContext:
假设我以自己的身份登录并且我的Windows用户名是" Scott",我希望HttpContext返回" DOMAIN \ Scott",但它返回没有。尝试访问虚拟目录时,我确实获得了Windows身份验证对话框,我可以成功验证为" Scott"。在IIS7身份验证对话框中,除了" Windows身份验证"之外,所有身份验证机制都将关闭。
奇怪的是,我有另一个网站,它的工作正常,我无法弄清楚有什么区别。我能看到的唯一区别是工作站点是一个真正的IIS网站,而我目前正在处理的是一个虚拟目录。
工作地点的输出低于。这就是我试图在虚拟目录上复制但我必须遗漏的东西。
Windows username: DOMAIN\Scott
System.Environment.Username: AppContext
HttpContext: DOMAIN\Scott
附加说明:
<identity>
元素。<authentication mode="Windows" />
设置正确。Page_Init
方法中执行。答案 0 :(得分:0)
检查您的授权设置。
如果匿名用户可以访问资源 - 并且浏览器请求链中没有资源触发了身份验证 - IIS将不会对用户进行身份验证。
因此,您必须拥有Windows身份验证并拒绝匿名访问才能在HttpContext中查看用户名。
答案 1 :(得分:0)
在文件夹中添加Web.config并设置<authentication mode="Windows"/>
答案 2 :(得分:0)
您将在System.Threading.Thread.CurrentPrincipal.Identity.Name中找到它。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(System.Threading.Thread.CurrentPrincipal.Identity.Name);
}
}