【问题标题】:MVC 4 intranet template using windows authorization - Roles does not work使用 Windows 授权的 MVC 4 Intranet 模板 - 角色不起作用
【发布时间】:2013-02-14 23:43:23
【问题描述】:

使用 Windows 2012 服务器和 VS2012,我使用 Intranet 模板创建了一个新的 MVC 4 项目以进行 Windows 身份验证。我将它发布到 Windows 2012 服务器。砰,一切正常,我可以仔细阅读该网站。所以我将以下内容添加到 HomeController:

[Authorize(Roles = @"DOMAIN\GROUP")]
public class HomeController : Controller 
{
...
}

身份验证仍然有效,但我立即看到带有大红色的错误页面:“错误。处理您的请求时发生错误。”

我尝试了域本地组、全局组、组的完整路径都不起作用。那我试试

[Authorize(Users = @"DOMAIN\ME")]
public class HomeController : Controller 
{
...
}

这行得通!但我想使用 Windows 组。我读过的所有内容都说它只使用 Roles = ...,但由于某种原因,我遗漏了一些东西。从基本模板我没有改变任何东西,只是添加了 [Authorize(Roles = "..."]。

我在 Google 上搜索了几个小时,最后大部分都在 stackoverflow 上。我错过了什么?它必须是一些简单的东西。

如果有帮助...该服务器是我自己的开发服务器,我在其他项目 WCF 和 ASP.NET Forms 网站中使用 Windows 身份验证和授权。

新进展:似乎对于角色,服务器正在尝试基于 SqlRoleProvider 访问角色成员身份

[SqlException (0x80131904): Login failed for user 'CS\CS446$'.]
...
System.Web.Security.SqlRoleProvider.GetRolesForUser(String username) +1466
System.Web.Security.RolePrincipal.IsInRole(String role) +12322757
System.Linq.Enumerable.Any(IEnumerable`1 source, Func`2 predicate) +149
System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +265
...

它确实使用 windows 对我进行身份验证,并且似乎也通过 windows 授权我。

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    以上症状让我回到了我实际发现问题的服务器配置。

    条件:这是默认站点中的一个应用程序,其中默认成员资格提供程序配置为 AspNetSqlRoleProvider。应用程序中的 .NET 角色从默认网站(或您使用的任何父网站)继承其设置。

    显然 MVC 4.5 的 Intranet 模板不包含此设置并接受角色的继承设置,但正确检查活动目录中的用户(即我在数据库中确实有一个用户不起作用但Windows 用户按照原始问题中的说明进行操作)。

    解决方案: 在 Web.config 中,我添加了以下行以启用 AspNetWindowsTokenRoleProvider 作为默认值并删除 AspNetSqlRoleProvider:

    <system.web>
      ...
      <roleManager defaultProvider="AspNetWindowsTokenRoleProvider" enabled="true">
        <providers>
          <remove name="AspNetSqlRoleProvider"/>
        </providers>
      </roleManager>
    </system.web>
    

    该部分似乎是可选的,因为我第一次使用以下内容:

    <roleManager defaultProvider="AspNetWindowsTokenRoleProvider" />
    

    我希望这可以帮助其他一些沮丧的灵魂。向 Trey 致敬,因为他让我考虑回到发现问题根源的 IIS 配置。

    【讨论】:

      【解决方案2】:

      当我在执行自己的操作时,在这个权利上留了下来很有趣。我认为你做得对,可能只是你正在测试的一个糟糕的 GROUP。

      这对我有用:

      [Authorize(Roles = @"DOMAIN\Domain Users")]
      public class HomeController : Controller
      

      这是我的 Web.config 的重要部分。

      <authentication mode="Windows" />
      <authorization>
          <deny users="?" />
      </authorization>
      <identity impersonate="true" />
      

      更新

      确保您的 connectionStrings 使用 SQL 登录,并且 SQL 已设置为混合模式,否则您必须返回设置并更改它。花了三天时间才发现开发人员在他们的开发盒上安装一次时没有选择混合模式。我觉得你在这个问题上很痛苦。

      【讨论】:

      • 可能不相关,但我们在设置开发环境时确实遇到了环回问题,因为我们的开发箱上有很多站点,我们使用主机标头。这修复了它:roelvanlisdonk.nl/?p=2325
      • Web.config 除了 之外是相同的,但这并没有解决它。我不使用主机标头......不太可能,但你让我想到了别的东西,我今天早上又在做这件事,会回来报告的。谢谢。
      • 感谢您的更新,我上面的 SQL 错误是我将连接字符串嵌入到应用程序的 web.config 显然呈现它这一事实的症状对子应用程序没用(不知道为什么,但它没有列在子站点连接字符串列表中)。当您有学生使用主站点但您不希望他们与您的其他项目一起玩时,这是一个很好的副作用。但根据您最初的观察,它处于混合模式。感谢您的快速回复!我解决了它并在上面(或下面视情况而定)详细说明了我的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多