【问题标题】:Accessing user details using Active Directory in an ASP.NET Core MVC app with Windows authentication在具有 Windows 身份验证的 ASP.NET Core MVC 应用程序中使用 Active Directory 访问用户详细信息
【发布时间】:2020-07-22 08:59:19
【问题描述】:

我试图通过 Windows 身份验证访问我的 ASP.NET Core MVC 项目中用户的名字、姓氏等用户信息。我实际上是在网上搜索解决方案后让它工作的,但我对这些东西和初学者级程序员很陌生,所以不明白我只是在我的项目中复制粘贴的部分发生了什么。

我在那个网站上也找不到任何解释。如果有人可以向我解释这一点,我会非常高兴。非常感谢。

此代码的网站参考:https://sensibledev.com/how-to-get-user-details-from-active-directory/

家庭控制器:

var username = User.Identity.Name;

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain"))
{
    var user = UserPrincipal.FindByIdentity(context, username);

    if (user != null)
    {
        ViewData["UserName"] = user.Name;
        ViewData["EmailAddress"] = user.EmailAddress;
        ViewData["FullName"] = user.DisplayName;
        ViewData["GivenName"] = user.GivenName;
    }
} 

【问题讨论】:

    标签: active-directory asp.net-core-mvc windows-authentication principalcontext


    【解决方案1】:

    该代码获取登录您网站的用户的用户名,并在您的域中查找该用户的更多信息。

    var username = User.Identity.Name;
    

    User 属性是ControllerBase.User,指的是当前登录到您网站的用户。由于您使用的是 Windows 身份验证,因此这将指的是 Active Directory 用户。 User.Identity.Name 只获取用户名。

    其余的用于在 Active Directory 中查找帐户。

    new PrincipalContext(ContextType.Domain, "yourdomain")
    

    这意味着“我想与一个名为 yourdomain 的域交谈”。

    UserPrincipal.FindByIdentity(context, username)
    

    UserPrincipal.FindByIdentity 在域中找到一个帐户。所以这就是说“在域上找到这个用户名”。

    然后将帐户中的用户详细信息放入ViewData 集合中,以便可以在视图中访问数据。更多详情 here

    【讨论】:

      【解决方案2】:

      从您网站的角度来看,所有 Windows 代码都在某个 Windows 帐户下运行。

      例如,如果您使用 IIS 和 Forms 身份验证,那么 Windows 对您一无所知 - 您很可能在所有用户都将在其下运行的匿名帐户名下运行。如果您向下钻取正在运行的代码,则可以在不同的代码级别找到不同的 Windows 帐户,例如在您的顶级代码、底层 IIS 线程等中。

      您正在尝试为您的网站使用 Windows 帐户,但您必须确保运行它的网络服务器也使用 Windows 身份验证 - 我知道您在创建网站时选中了此选项。

      您的用户身份可以转换为各种类型,因为无论使用哪种身份验证方法,它都必须无缝工作。您还可以检查您的用户,看看它是否属于特定的安全机制。

      看看https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-3.1&tabs=visual-studio

      【讨论】:

      • 谢谢,但我实际上是想逐行了解代码中发生了什么。 ViewData["FullName"] 如何返回用户的姓、名。
      • 您是指“ViewData”实例还是“user”实例?用户实例是具有各种用户属性的类。 Viewdata 实例只是一个包,您可以在其中添加您选择的值。 viewbag 的这些属性然后可以在 Razor 视图中使用,以按照您的意愿使用。代码将用户类中的每个属性分配给 ViewData 属性
      • 我不明白这两行 "using (var context = new PrincipalContext(ContextType.Domain, "yourdomain")) { var user = UserPrincipal.FindByIdentity(context, username);"跨度>
      【解决方案3】:

      您使用

      获取安全原则信息
      var context = new PrincipalContext(ContextType.Domain, "yourdomain")
      

      PrincipleContext 是在您创建它的新实例后拥有信息的类,传入域类型(枚举)和域名称(字符串)的参数。

      USING 块可确保在块完成后释放实例 - 否则您必须自己在该实例上调用 DISPOSE(请记住,如果有异常,您可能没有捕获到,因此您至少必须管理此场景.

      一旦您拥有域上下文的实例,您就可以使用它来搜索(在 Windows 的情况下为 LDAP 数据库)用户,无论是按 SID 还是唯一名称,在您的情况下(每个名称必须是唯一的 -域中的两个用户不能具有相同的名称)。

      该网站具有用户的安全 ID,您所遵循的代码会为该用户获取一个域对象,该对象具有您将显示的属性。您可以调用其他对象,这些对象可能会告诉您用户是哪些 Windows 安全组的成员。通过这种方式,您可以拥有一个网站,其中用户查看网页或单击按钮的能力取决于用户所属的域中的哪些组。

      【讨论】:

        猜你喜欢
        • 2013-12-08
        • 2014-04-19
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        相关资源
        最近更新 更多