将.NET MVC应用程序中的User.Identity映射到活动目录用户

时间:2014-01-23 10:22:26

标签: asp.net-mvc active-directory asp.net-mvc-5

我正在内部网上编写.NET MVC 5应用程序,使用Windows身份验证,需要查询Active Directory以查看可用的组,然后检查用户是否处于该角色。

组和用户名的来源将是活动目录。然后,我需要使用.NET Identity检查身份和成员身份。我不确定哪些字段映射到什么。

AD中感兴趣的领域似乎是:

  • SamAccountName:我认为这是我从User.Identity获得的用户名,但文档说这个属性是: 用于支持运行早期版本操作系统的客户端和服务器的登录名,例如Windows NT 4.0,Windows 95,Windows 98和LAN Manager。
  • CN :用户姓名的可显示版本
  • objectGUID:不会发生变化的用户或群组的标识符。重要的是,如果用户的姓氏发生变化,用户将更改其用户名。

所以,我认为 SamAccountName == User.Identity.Name ,但文档说SamAccountName适用于早期的操作系统。这是否有效意味着这已被弃用,我应该使用别的东西?

另外,关于CN和objectGUID的断言是否正确?

1 个答案:

答案 0 :(得分:3)

第一步:设置参数以使用AD:

在web.config文件的部分中,设置以下内容:

<authentication mode="Windows" />

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
   <providers>
      <clear />
      <add 
          name="AspNetWindowsTokenRoleProvider"
          type="System.Web.Security.WindowsTokenRoleProvider" 
          applicationName="/" />
   </providers>
</roleManager>

现在,您将能够直接使用System.Web.Security命名空间中的方法。

如果您想将对View的访问权限仅限于AD的“groupName”组的成员:

你只需要像这样装饰你的控制器动作:

[Authorize(Roles = @"DOMAIN\groupName")]
Public ActionResult Index()
{...}

如果您想根据AD用户群进行治疗:

在治疗中使用“IsInRole(rolename)”等方法:

if (User.IsInRole("DOMAIN\\groupName"))
{
     // Do what you want
}

编辑:有问题的实现:在这里,您应该在创建任务时将受影响的组的sAMAccountName保存到您的任务中。然后,当用户想要将任务标记为完成时,只需检查:

if (User.IsInRole("DOMAIN\\" + sAMAccountNameOfTheGroupDedicatedToYourTask))
{
     // Mark as complete
}