使用Active Directory组进行Windows身份验证

时间:2014-02-11 22:05:24

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

我有一个小项目,使用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组获取。
  4. 所以,假设#3是真的,我尝试阅读很多关于此的帖子,但它们似乎分为两个基本组:

    1. 直截了当,简单的方法,我无法开展工作,可能是因为它假设了一些我没有的知识。
    2. 复杂的自定义编码方法,我怀疑它是通过代码完成的,可以在无代码方法中完成。
    3. 假设#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等相当陌生,所以请使用小词。 : - )

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:0)

您还可以在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);
    }
}