使用Windows授权的MVC 4内部网模板 - 角色不起作用

时间:2013-02-14 00:13:40

标签: asp.net-mvc-4

使用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 =“...”)。

我在谷歌搜索了几个小时,最后大部分时间都是在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授权我。

2 个答案:

答案 0 :(得分:1)

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

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

Under .NET Roles for your application, Click Set Default Provider...

显然,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配置,我发现根本问题。

答案 1 :(得分:0)

当我自己实施时,有趣地对这个权利进行调查。我认为你做得对,可能只是你正在测试的坏组。

这对我有用:

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

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

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

更新

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