使用Windows身份验证和活动目录组作为角色

For*_*Two 33 asp.net-mvc active-directory windows-authentication

我已经阅读了关于这个主题的几个问题,比如这里,这里,这里这里 ; 但在我的案例中没有一个提供了有效的解决方案.

我想做的事:

为仅由我们自己的员工使用的Web应用程序实施Windows身份验证.这样他们就不需要登录应用程序,但已经通过登录Windows进行身份验证.

此外,我需要根据用户可能分配到的Active Directory安全组来限制应用程序的某些区域.

所以我希望能够装饰Controllers/Actions

[Authorize(Roles="SomeRole")]
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

我有

<authentication mode="Windows" />
Run Code Online (Sandbox Code Playgroud)

在我的web.config中.我<roleManager>在上面链接的一些帖子中添加了几个a的排列.目前我有这个角色经理

<roleManager defaultProvider="WindowsProvider"
  enabled="true"
  cacheRolesInCookie="false">
      <providers>
        <add
          name="WindowsProvider"
          type="System.Web.Security.WindowsTokenRoleProvider" />
      </providers>
    </roleManager>
Run Code Online (Sandbox Code Playgroud)

这篇文章中找到.

事实上,如果我装饰一个控制器[Authorize],我可以很好地访问它.

然而:

我可以在网络上的用户设置中看到,我是名为"IT"的AD安全组的成员.但是,如果我装饰相同的控制器,[Authorize(Roles="IT")]我得到的是由asp.net开发服务器为未授权的401服务的空白屏幕. 这是出乎意料的. 我认为我应该能够查看页面,因为我登录到Windows并且是"IT"组的一部分.

我在这个主题上发现的大部分内容都让我觉得很难完成我想要做的事情,但我在这里显然遗漏了一些东西.

ozh*_*hug 39

对于开发人员,我使用IISExpress与MVC项目的开发服务器属性设置,以便禁用匿名身份验证并启用Windows身份验证.使用我们的TFS构建服务器部署Web配置,以测试和释放服务器,其身份验证也如上所述,并且也在这些位置工作.

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

我可以用

[Authorize(Roles = @"DOMAIN\ADGroup")]
Public ActionResult Index()
{...}
Run Code Online (Sandbox Code Playgroud)

要么

 public ActionResult Index()
        {
            var User = System.Web.HttpContext.Current.User;
            if (User.IsInRole("DOMAIN\\ADGroup"))
            {
                return RedirectToAction("IRSAdmin");
            }
            return View();
        }
Run Code Online (Sandbox Code Playgroud)

在我记得注销并重新登录之后,应用了给予AD组的权限.

  • 额外的注意事项,就像我一样,你正在敲打桌子几个小时试图解决这个问题:当您物理连接到公司网络时,注销/登录只会获取新凭据...当您的无线网络时登录之后才会出现连接,然后您的计算机将无法从域控制器中获取新的组成员资格,您将在一段时间内不知所措...... (4认同)
  • @DanielHume那是因为AD在有线连接上同步最好.您可以在命令行上运行gpupdate以获得相同的效果 (2认同)