Asp.net core ASP.NET核心MVC-Program.cs中的用户
我试图根据用户角色在程序类中加载不同的JSON文件。我在站点上使用windows身份验证和存储角色的基本表。我稍后加载了实现ICLAIMS转换的角色,没有任何问题,但在此之前我无法确定请求者用户 当我调用System.Security.Principal.WindowsIdentity.GetCurrent().Name时,我仅获取DOMAIN\MACHINE$ 你知道如何让windows用户到那里吗?这是我的Program.cs文件:Asp.net core ASP.NET核心MVC-Program.cs中的用户,asp.net-core,model-view-controller,asp.net-core-3.1,Asp.net Core,Model View Controller,Asp.net Core 3.1,我试图根据用户角色在程序类中加载不同的JSON文件。我在站点上使用windows身份验证和存储角色的基本表。我稍后加载了实现ICLAIMS转换的角色,没有任何问题,但在此之前我无法确定请求者用户 当我调用System.Security.Principal.WindowsIdentity.GetCurrent().Name时,我仅获取DOMAIN\MACHINE$ 你知道如何让windows用户到那里吗?这是我的Program.cs文件: public static void Main(s
public static void Main(string[] args)
{
using (var context = new ManualBookingContext("xxx"))
{
var user = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
User dbUser = context.Users.Include(x => x.UserRoles).ThenInclude(x => x.Role).FirstOrDefault(x => x.Username.ToLower() == user.ToLower());
if(dbUser != null)
args = dbUser.UserRoles.Select(u => u.Role.Name).ToArray();
}
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var sidebar = "sidebar.json";
foreach (var arg in args)
{
if (arg == "Admin")
sidebar = "sidebar-admin.json";
}
return Host.CreateDefaultBuilder()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile(sidebar,
optional: true,
reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
publicstaticvoidmain(字符串[]args)
{
使用(var上下文=新的ManualBookingContext(“xxx”))
{
var user=System.Security.Principal.WindowsIdentity.GetCurrent().Name;
User dbUser=context.Users.Include(x=>x.UserRoles)。然后Include(x=>x.Role)。FirstOrDefault(x=>x.Username.ToLower()==User.ToLower());
if(dbUser!=null)
args=dbUser.UserRoles.Select(u=>u.Role.Name).ToArray();
}
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
{
var sidebar=“sidebar.json”;
foreach(args中的变量arg)
{
如果(arg==“Admin”)
sidebar=“sidebar admin.json”;
}
返回Host.CreateDefaultBuilder()
.ConfigureAppConfiguration((hostingContext,config)=>
{
config.AddJsonFile(侧栏,
可选:true,
重新加载更改:true);
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
WindowsIdentity.GetCurrent
获取当前进程的windows用户。例如,asp.net服务器似乎在系统用户帐户域\机器$
下运行
另请参见本帖:
正如其他一些人提到的,这是计算机帐户本身,而不是用户帐户。
像这样的ASP身份验证错误通常是由于计算机帐户本身作为身份验证令牌而不是用户帐户传递
要确认这一点,您可以尝试在所需用户下运行应用程序,并查看是否提供了正确的用户名
至于修复,我过去也遇到过类似的问题,我使用WMI(windows management instrumentation)获取当前登录的用户。我发现这篇文章看起来很棒,其中包含一些现成的代码:
公共类机器
{
私有静态对象_classLocker=新对象();
专用静电机(u机),;
专用机器()
{
}//结束专用计算机()
公共静态机器getInstance()
{
如果(_machine==null)
{
锁(_classLocker)
{
如果(_machine==null)
{
_机器=新机器();
}
}
}
返回机器;
}//结束公共静态机器getInstance()
公共字符串getUsername()
{
字符串username=null;
尝试
{
//定义WMI作用域以查找Win32_ComputerSystem对象
ManagementScope ms=new ManagementScope(“\\.\\root\\cimv2”);
Connect女士();
ObjectQuery=新建ObjectQuery
(“从Win32_计算机系统中选择*);
ManagementObjectSearcher搜索器=
新的ManagementObjectSearcher(ms,查询);
//此循环最多只运行一次。
foreach(searcher.Get()中的ManagementObject mo)
{
//提取用户名
username=mo[“username”].ToString();
}
//从用户名中删除域部分
字符串[]usernameParts=username.Split('\\');
//用户名包含在最后一个字符串部分中。
username=usernameParts[usernameParts.Length-1];
}
捕获(例外)
{
//系统当前没有登录的用户
//将用户名设置为“SYSTEM”表示
用户名=“系统”;
}
返回用户名;
}//结束字符串getUsername()
}//端类机器
请注意,由于您在asp.net core中,您可能需要安装其他软件包才能使用wmi,例如
好的,在这一点之后,通过IIS的windows身份验证工作正常,我可以在控制器、助手中获取用户名…只有在第一个程序类中,我无法获取发出请求的用户。uuuh ppft让我想一想,你能检查
环境。用户名
提供了什么吗?我相信这可能有som这与模拟以及您现在使用的代码和环境有关。用户名可能会因为模拟而产生不同的结果,但我不记得是什么。