【问题标题】:ASP.NET CORE MVC - User in Program.csASP.NET CORE MVC - Program.cs 中的用户
【发布时间】:2020-10-05 07:09:43
【问题描述】:

我正在尝试根据用户角色在 Program 类中加载不同的 JSON 文件。我在站点上使用 Windows 身份验证和存储角色的基本表。我稍后加载实现 IClaimsTransformation 的角色,没有任何问题,但我无法在此之前确定请求者用户...

我只在调用 System.Security.Principal.WindowsIdentity.GetCurrent().Name 时获得 DOMAIN\MACHINE$;

任何关于如何让 windows 用户在那里的想法?这是我的 Program.cs 文件:

    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>();
        });

【问题讨论】:

    标签: asp.net-core model-view-controller asp.net-core-3.1


    【解决方案1】:

    WindowsIdentity.GetCurrent 获取当前进程的 windows 用户。 IE。好像asp.net服务器在系统用户账号DOMAIN\MACHINE$下运行。

    另见这篇文章:

    正如其他一些人所提到的,它是计算机帐户本身而不是用户帐户。 像这样的 ASP 身份验证错误通常是由于计算机帐户本身作为身份验证令牌而不是您的用户帐户传递的。

    https://serverfault.com/a/66700

    要确认这一点,您可以尝试在所需用户下运行应用程序,看看是否提供了正确的用户名。

    至于修复,我过去也遇到过类似的问题,我曾使用 WMI(Windows 管理工具)来获取当前登录的用户。我发现这篇文章看起来很棒,并且包含一些现成的代码:

    public class Machine
    {
        private static Object _classLocker = new Object();
        private static Machine _machine; 
     
        private Machine()
        {
        } // end private Machine()
     
        public static Machine getInstance()
        {
            if (_machine == null)
            {
                lock (_classLocker)
                {
                    if (_machine == null)
                    {
                        _machine = new Machine();
                    }
                }
            }
            return _machine;
        } // end public static Machine getInstance()
     
        public String getUsername()
        {
            string username = null;
            try
            {
                // Define WMI scope to look for the Win32_ComputerSystem object
                ManagementScope ms = new ManagementScope("\\\\.\\root\\cimv2");
                ms.Connect();
     
                ObjectQuery query = new ObjectQuery
                        ("SELECT * FROM Win32_ComputerSystem");
                ManagementObjectSearcher searcher =
                        new ManagementObjectSearcher(ms, query);
     
                // This loop will only run at most once.
                foreach (ManagementObject mo in searcher.Get())
                {
                    // Extract the username
                    username = mo["UserName"].ToString();
                }
                // Remove the domain part from the username
                string[] usernameParts = username.Split('\\');
                // The username is contained in the last string portion.
                username = usernameParts[usernameParts.Length - 1];
            }
            catch (Exception)
            {
                // The system currently has no users who are logged on
                // Set the username to "SYSTEM" to denote that
                username = "SYSTEM";
            }
            return username;
        } // end String getUsername()
    } // end class Machine
    

    https://www.techcoil.com/blog/how-to-retrieve-the-username-of-the-user-who-logged-onto-windows-from-windows-service/

    请注意,由于您使用的是 asp.net core,因此您可能需要安装其他软件包才能使用 wmi,例如

    https://www.nuget.org/packages/System.Management/

    【讨论】:

    • 好吧,在这一点之后,通过 IIS 的 Windows 身份验证工作正常,我可以在控制器、助手中获取用户名......只有在第一个程序类中我无法获取用户那就是发出请求。
    • uuh ppft 让我在这里想想,你能检查一下Environment.Username 给出了什么吗?我相信这可能与模拟有关,您现在使用的代码和 Environment.Username 可能会因为模拟而产生不同的结果,但我不记得是什么。
    猜你喜欢
    • 2020-07-11
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多