【问题标题】:Windows Authentication with Active Directory Groups使用 Active Directory 组进行 Windows 身份验证
【发布时间】:2016-10-26 02:44:43
【问题描述】:

我有一个小项目,使用 Visual Studio 2013、.NET 4.5、MVC 5 和 EF 6 构建。我使用 Windows 身份验证创建它,但现在我需要检查 Active Directory 组中的成员资格以允许或拒绝访问。

我已经陷入了许多非常深的兔子洞,试图找出如何做到这一点。起初我认为我需要更改项目以使用“本地”身份验证。但是,我发现:

  1. 在 VS 2013 中显然无法更改项目使用的身份验证类型(除了手动编辑某些文件)。
  2. 目前还没有任何文档解释如何设置“本地”身份验证。 (真的吗?怎么可能?)
  3. 无论如何,我需要的根本不是“本地”身份验证,因为这仅适用于 Windows 身份联合服务(或类似的服务)。我应该使用的只是带有 ASP.Net 角色的 Windows 身份验证,Windows 显然是在我登录时从 Active Directory 组中获取的。

所以,假设 #3 是真的,我尝试阅读大量关于此的帖子,但它们似乎分为两个基本组:

  1. 直截了当、简单的方法,我无法开始工作,可能是因为它假定了一些我没有的知识。
  2. 复杂的自定义编码方法,我怀疑这些方法是通过代码完成的,而这可能在无代码方法中可以完成。

假设 #1 是要走的路,这是我最近的尝试。

在我的控制器中,我有:

[Authorize(Roles=@"SomeDomain\\SomeGroup")]
public class SomeController : Controller

在我的 Web.config 文件中,我有:

  <system.web>
    <authentication mode="Windows" />
    <authorization>
      <deny users="?" />
    </authorization>
    <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
      <providers>
        <clear/>
        <add name="AspNetWindowsTokenRoleProvider"
             type="System.Web.Security.WindowsTokenRoleProvider"
             applicationName="/" />
      </providers>
    </roleManager>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="BehaviorConfiguration">
          <serviceAuthorization
               principalPermissionMode="UseAspNetRoles"
               roleProviderName="AspNetWindowsTokenRoleProvider" />
          <serviceMetadata />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

当我尝试访问该页面时,系统会提示我登录。输入我的登录 ID 和密码后,我继续收到登录提示。我无法访问该页面。

我没有任何东西可以告诉我的应用程序 Active Directory 服务器在哪里,但我得到的印象是 Windows 已经知道这一点(因为当我登录到 Windows 时,它会访问 Active Directory 服务器以对我进行身份验证) .

我错过了什么吗?还是我假设无需编写自定义代码就可以完成此操作是错误的?

警告:我来自 Java 世界,对 .NET、MVC 等还很陌生,所以请使用小词。 :-)

【问题讨论】:

  • 你应该看看这个问题。这可能是针对早期版本的 mvc,但 Windows 身份验证已经有一段时间没有改变了。 stackoverflow.com/questions/13767439/…
  • 我之前看过那篇文章,并基于我尝试过的大部分内容,但它不起作用。然而,我现在才发现我做错了什么。在我的控制器的属性中,我在域名称和角色名称之间有 2 个反斜杠,而不是一个。所以我有:[Authorize(Roles=@"SomeDomain\\SomeGroup")] 而不是 [Authorize(Roles=@"SomeDomain\SomeGroup")] Doh!

标签: c# asp.net asp.net-mvc authentication asp.net-mvc-5


【解决方案1】:

我发现了问题。我上面的内容是正确的,除了我在域名和角色名称之间有两个反斜杠,而不是一个。修复只是将其更改为:

[Authorize(Roles=@"SomeDomain\SomeGroup")]

【讨论】:

  • .NET 学习者的解释性说明:将@ 放在任何字符串字面量之前意味着“完全按照所写的方式获取此字符串,不赋予反斜杠符号任何特殊权力作为控制代码的转义符号”。另一种方法是将@ 放在字符串之前,然后将反斜杠加倍,因为每个\\ 将被解释为单个文字\。这是为了允许 C 风格的控制代码,例如\r\n\t 等等。不过很好地解决了你自己的问题!
【解决方案2】:

您也可以在 App_Start 文件夹中的 RegisterGlobalFilters 中将此设置为过滤器。

 public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        if (filters == null)
        {
            throw new ArgumentNullException("filters");
        }

        filters.Add(new HandleErrorAttribute());

        var authorizeAttribute = new AuthorizeAttribute
        {
            Roles = "Domain\Group" // Role = group in Active Directory
        };

        filters.Add(authorizeAttribute);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2016-05-12
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多