0

使用 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 对我进行了授权。

4

2 回答 2

1

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

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

在您的应用程序的 .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 配置。

于 2013-02-14T15:43:23.043 回答
0

当我实施自己的时候,在这个权利上胡作非为很有趣。我认为你做得对,可能只是你正在测试的一个糟糕的 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 设置为混合模式,否则您必须返回设置并更改它。花了三天时间才发现开发人员在他们的开发盒上安装一次时没有选择混合模式。我觉得你在这个问题上很痛苦。

于 2013-02-14T01:34:23.197 回答