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

Wal*_*orn 11 c# asp.net authentication asp.net-mvc 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组获取.

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

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

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

在我的控制器中,我有:

[Authorize(Roles=@"SomeDomain\\SomeGroup")]
public class SomeController : Controller
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

当我尝试访问该页面时,我被提示登录.输入我的登录ID和密码后,我继续收到登录提示.我不被允许进入该页面.

我在任何地方都没有告诉我的应用程序Active Directory服务器的位置,但我得到的印象是Windows已经知道(因为,当我登录到Windows时,它访问Active Directory服务器来验证我).

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

警告:我对来自Java世界的.NET,MVC等相当新,所以请使用小词.:-)

Wal*_*orn 9

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

[Authorize(Roles=@"SomeDomain\SomeGroup")]
Run Code Online (Sandbox Code Playgroud)

  • .NET学习者的解释性说明:在任何字符串文字之前加上"@"意味着"完全按照写入的方式使用此字符串,而不给反斜杠符号任何特殊的权力作为控制代码的转义符号".另一种方法是在字符串之前删除`@`,然后将反斜杠加倍,因为每个\\将被解释为单个文字\.这是为了允许C风格的控制代码,例如`\ r \n\t\t`等等.尽管解决你自己的问题做得很好! (3认同)