【问题标题】:Custom Forms Authentication + MVC3 + AuthorizeAttribute自定义表单身份验证 + MVC3 + AuthorizeAttribute
【发布时间】:2011-12-19 22:25:33
【问题描述】:

我基本上做的是this。但是,每当我使用内置的 AuthorizeAttribute 时,MVC 框架(我猜)从不查看我的主体来确定用户是否具有正确的角色。它一直试图在 app_data 目录中创建一个新的 MDF 文件,并且因为它没有特权,所以它爆炸了。

这是预期的行为,我应该派生自己的 AuthorizeAttribute 并自己检查主体吗?

要指出的另一个奇怪行为是,我在同一个域上有两个站点,我正在为此进行单点登录。在任一站点上,我都使用相同的类库在 AuthenticateRequest 上重新创建自定义主体,并且在调试时看到主体在每个站点上都正确设置。但是,站点 1(对用户进行身份验证的站点)使用内置的 AuthorizeAttribute,并且运行良好,但是站点 2 会在调用任何具有 AuthorizeAttribute 的操作时尝试创建 MDF 文件。

【问题讨论】:

  • 好的,我想我找到了更多信息。我的自定义主体对象正在我的 Global.asax 文件中的 PostAuthenticateRequest 方法中更改为 RolePrincipal。如果我将自定义主体集逻辑移动到 PostAuthenticateRequest 方法中。一切正常,但我不必为其他站点执行此操作,而且我找不到他们的 web.config 文件之间的区别。所以我真正想做的就是弄清楚是什么将我的主体更改为 RolePrincipal 对象,然后禁用它。

标签: asp.net-mvc-3 forms-authentication


【解决方案1】:

好的,我想通了,我必须将它添加到我的 web 配置中 system.webServer 下。这将删除替换我的主体的 HttpModule。

<modules runAllManagedModulesForAllRequests="true">
    <remove name="RoleManager" />
</modules>

【讨论】:

  • 感谢您识别有问题的模块。请考虑不要使用模块属性runAllManagedModulesForAllRequests="true"。其他人说don't use it,因为模块甚至可以在 jpg 图像请求之类的东西上运行。这可能是一种资源浪费。只是删除 RoleManager 对我有用。
【解决方案2】:

默认情况下,新的 MVC3 应用程序使用 SqlMembershipProvider 作为默认授权机制,并尝试将详细信息存储在 SQL Express db(MDF 文件)中。

所以尝试在 web.config 中清除它:

<membership>
   <providers>
      <clear />
   </providers>
</membership>

只要您正确实现所有安全对象(IPrincipalIIdentity),并解密Application_AuthenticateRequest 上的表单身份验证票证,内置的[Authorize(Roles="RoleName")] 应该适合您。

在您发布的那个链接中,这基本上就是我们正在做的事情,而且效果很好。

【讨论】:

  • 感谢您的回答。我已经尝试过您的建议(之前几次,然后再一次为了安全起见),我仍然得到一个 RolePrincipal 而不是我在 Application_AuthenticateRequest 中设置的自定义主体。有什么想法吗?
  • 我什至试过:&lt;membership&gt; &lt;providers&gt; &lt;clear /&gt; &lt;/providers&gt; &lt;/membership&gt; &lt;roleManager enabled="false"/&gt;
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
相关资源
最近更新 更多