关于c#:带有Active Directory组的Windows身份验证

Windows Authentication with Active Directory Groups

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

我掉了很多非常深的兔子洞,试图找出方法。最初,我认为我需要将项目更改为使用"本地"身份验证。但是,我发现:

  • VS 2013中显然没有办法更改项目使用的身份验证类型(除了手动编辑某些文件之外)。
  • 尚无任何文档说明如何设置"本地"身份验证。 (真的吗?怎么可能?)
  • 无论如何,我根本不需要"本地"身份验证,因为这仅适用于Windows Identity Federation服务(或类似的东西)。我应该使用的只是带有ASP.Net角色的Windows身份验证,当我登录时Windows显然是从Active Directory组获得的。
  • 因此,假设#3是正确的,我尝试阅读有关此内容的大量文章,但它们似乎分为两个基本组:

  • 简单,简单的方法,我无法使用,可能是因为它假定了我所不具备的一些知识。
  • 我怀疑复杂的,自定义编码的方法是通过代码完成的,而这可能是在无代码的方法中完成的。
  • 假设要走#1,这是我最近的尝试。

    在我的控制器中,我有:

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
      <system.web>
       
       
          <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服务器以对我进行身份验证) 。

    我错过了什么吗?还是我认为无需编写自定义代码就可以做到这一点是错误的吗?

    注意事项:我对.NET,MVC等不是很熟悉,因为它来自Java界,所以请使用一些简单的单词。 :-)


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

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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     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);
        }
    }