【发布时间】:2014-06-11 14:05:29
【问题描述】:
这就是我正在尝试做的事情:
我想使用 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
附加说明:
- 这两个网站在 web.config 中都没有
<identity>元素。 -
<authentication mode="Windows" />设置正确。 - 虚拟目录和站点都只在 IIS 中启用了 Windows 身份验证。
- 代码正在
Page_Init方法中执行。 - 底线是,我只需要让站点本身在“AppContext”用户(AppPool 配置为运行)的安全上下文下运行,但我需要获取当前登录用户的名称在 default.aspx.cs 代码后面。
【问题讨论】:
-
您的 Web.config 中的身份验证模式是什么?是
<authentication mode="Windows" />吗? -
还要确保为您的项目禁用匿名身份验证(选择 Web 窗体项目,然后按 F4 打开“属性”面板)并启用 Windows 身份验证。这些都是项目属性。
-
更新了问题以包含“
-
你什么时候打电话?
-
丹尼尔,在我的问题底部的注释部分,它提到我在 Page_Init 中调用它
标签: c# asp.net .net windows-authentication