Active directory 在具有Windows身份验证的ASP.NET核心MVC应用程序中使用Active Directory访问用户详细信息

Active directory 在具有Windows身份验证的ASP.NET核心MVC应用程序中使用Active Directory访问用户详细信息,active-directory,asp.net-core-mvc,windows-authentication,principalcontext,Active Directory,Asp.net Core Mvc,Windows Authentication,Principalcontext,在我的带有Windows身份验证的ASP.NET核心MVC项目中,我试图访问用户信息,如用户名和姓氏。事实上,我在网上搜索解决方案后就成功了,但我对这方面的东西很陌生,而且还是初级程序员,所以不了解我在项目中复制粘贴的部分发生了什么 我在那个网站上也找不到任何解释。如果有人能给我解释一下,我会非常高兴的。非常感谢 此代码的网站参考: 家庭控制器: var username = User.Identity.Name; using (var context = new PrincipalConte

在我的带有Windows身份验证的ASP.NET核心MVC项目中,我试图访问用户信息,如用户名和姓氏。事实上,我在网上搜索解决方案后就成功了,但我对这方面的东西很陌生,而且还是初级程序员,所以不了解我在项目中复制粘贴的部分发生了什么

我在那个网站上也找不到任何解释。如果有人能给我解释一下,我会非常高兴的。非常感谢

此代码的网站参考:

家庭控制器:

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

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

例如,如果您使用IIS和表单身份验证,则Windows对您一无所知—您可能使用的是所有用户都将使用的匿名帐户名。如果深入查看正在运行的代码,可以在不同的代码级别(例如顶级代码、底层IIS线程等)找到不同的Windows帐户

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

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


请看一看

该代码采用登录您网站的用户的用户名,并在您的域中查找该用户的详细信息

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

其余部分用于在Active Directory中查找帐户

new PrincipalContext(ContextType.Domain, "yourdomain")
这意味着“我想和一个名为
yourdomain
”的域通话

在域上查找帐户。这是说“在域中查找此用户名”


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

您可以使用

var context = new PrincipalContext(ContextType.Domain, "yourdomain")
PrincipleContext是一个类,它在创建一个新的实例后就拥有这些信息,并传入域类型(枚举)和域名称(字符串)的参数

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

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


该网站具有该用户的安全ID,您所遵循的代码将获取该用户的域对象,该域对象具有您将显示的属性。您可以调用其他对象,这些对象可能会告诉您该用户是哪个Windows安全组的成员。这样,您就可以拥有一个网站,用户可以在其中查看网页或单击ton知道用户是域中哪些组的成员。

谢谢,但实际上我想逐行了解代码中发生了什么。ViewData[“FullName”]如何返回用户的lastname,firstname。您是指“ViewData”实例还是“user”实例?用户实例是一个具有各种用户属性的类。Viewdata实例只是一个包,您可以在其中添加自己选择的值。然后,viewbag的这些属性可以在Razor视图中按您的意愿使用。代码将用户类中的每个属性分配到Viewdata属性我不理解这两行s“使用(var context=newprincipalcontext(ContextType.Domain,“yourdomain”){var user=UserPrincipal.FindByIdentity(context,username);”
var context = new PrincipalContext(ContextType.Domain, "yourdomain")