我有一个使用ASP.NET Core RC2在MVC6中构建的Intranet站点。我想获取访问Intranet站点的人的Windows用户名。
因此,如果Jim访问内部网站点,我希望该站点接收" Domain \ Jim",如果Anne进入内部网站,我希望该站点接收" Domain \ Anne&# 34。
我的IIS服务器上仅启用了Windows身份验证,禁用了匿名身份验证。
我的网站设置为使用Windows身份验证并禁用匿名身份验证。
<system.web>
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
</system.web>
通过调试我可以使用System.Security.Principal.WindowsIdentity.GetCurrent().Name
,但这当然会返回&#34; IIS APPPOOL \ SiteName&#34;在IIS服务器上。
我使用HttpContext从旧版本的ASP.NET中找到了许多示例,我尝试使用以下内容将其注入我的控制器,但userName最终为null。
//Startup.cs
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//HomeController.cs
public HomeController(IHttpContextAccessor _accessor)
{
string userName = _accessor.HttpContext.User.Identity.Name;
}
将Windows用户名传递给ASP.NET Core RC2 MVC6中的Intranet站点的正确方法是什么?
答案 0 :(得分:5)
对于在Intranet应用程序上使用Windows身份验证的任何其他人,只希望能够检索有关用户的信息,您可能会想到更简单。
在您的控制器中,此行将以DOMAIN \ username格式获取当前用户的用户名。
var userId = this.User.Identity.Name;
我花了一些时间查看其他答案,然后才意识到他们中的大多数人都认为我正在实施针对AD进行身份验证的个人帐户,而不是开箱即用的Windows身份验证。
答案 1 :(得分:2)
可能会帮助仍在寻找的人。根据来自MS https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2的文档,在ConfigureServices方法(startup.cs)中添加HttpContextAccessor。 将此httpcontextaccessor传递到控制器中并访问已登录的用户。
我遵循了这个步骤,即使将核心网站部署到IIS,也能够获得Windows Authenticated登录用户。
这是代码段
在Startup.cs中(在ConfigureServices方法下)添加该行
services.AddHttpContextAccessor();
然后在控制器文件中,添加以下必要的代码行。下面的代码是一个示例。
public YourController : Controller
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly string _user;
public YourController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_user = _httpContextAccessor.HttpContext.User.Identity.Name;
}
}
答案 2 :(得分:0)
使用var userId = this.User.Identity.Name;
为我工作。我的应用程序在Intranet上运行,我想要做的就是从Windows获取用户的登录ID。我不需要存储用户的信息,因为它已经存储在Active Directory中。
答案 3 :(得分:0)
ServiceSecurityContext.Current?.PrimaryIdentity