Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Active Directory组进行Windows身份验证_C#_Asp.net_Asp.net Mvc_Authentication_Asp.net Mvc 5 - Fatal编程技术网

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

C# 使用Active Directory组进行Windows身份验证,c#,asp.net,asp.net-mvc,authentication,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Authentication,Asp.net Mvc 5,我有一个小项目,使用Visual Studio 2013、.NET 4.5、MVC 5和EF 6构建。我使用Windows身份验证创建了它,但现在我需要检查Active Directory组中的成员身份,以允许或拒绝访问 我已经下了很多很深的兔子洞,试图找出如何做到这一点。起初,我假设需要将项目更改为使用“内部部署”身份验证。然而,我发现: 在VS 2013中,显然没有办法更改项目使用的身份验证类型(手动编辑某些文件除外) 目前还没有任何文档说明如何设置“本地”身份验证。(真的吗?这怎么可能?)

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

我已经下了很多很深的兔子洞,试图找出如何做到这一点。起初,我假设需要将项目更改为使用“内部部署”身份验证。然而,我发现:

  • 在VS 2013中,显然没有办法更改项目使用的身份验证类型(手动编辑某些文件除外)
  • 目前还没有任何文档说明如何设置“本地”身份验证。(真的吗?这怎么可能?)
  • 在任何情况下,我需要的根本不是“本地”身份验证,因为这只是针对Windows身份联合服务(或类似服务)。我应该改为使用ASP.Net角色的Windows身份验证,当我登录时,Windows显然是从Active Directory组获得的
  • 所以,假设#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服务器来验证我的身份)

    我错过什么了吗?或者我错误地认为这可以在不编写自定义代码的情况下完成


    注意:我是.NET、MVC等的新手,来自Java世界,所以请使用小词::-)

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

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

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

    你应该检查一下这个问题。这可能是mvc的早期版本,但Windows身份验证在一段时间内没有改变。我早些时候看过那篇文章,大部分是基于我在上面的尝试,但它不起作用。然而,我现在才明白我做错了什么。在控制器中的属性中,域名称和角色名称之间有两个反斜杠,而不是一个。所以我有:
    [Authorize(Roles=@“SomeDomain\\SomeGroup”)]
    而不是
    [Authorize(Roles=@“SomeDomain\SomeGroup”)]
    Doh!NET学习者的解释性说明:将
    @
    放在任何字符串文字之前意味着“将此字符串完全按照所写内容进行处理,而不将反斜杠符号作为控制代码的转义符号赋予任何特殊权力”。另一种方法是将
    @
    放在字符串之前,然后将反斜杠加倍,因为每个\\都将被解释为单个文字\。这是为了允许使用C样式的控制代码,例如
    \r\n\t
    等。不过,对于解决您自己的问题来说,这已经做得很好了!