Asp.net mvc 4 使用simplemembership在新的MVC 4 Internet模板中进行基于角色的身份验证

Asp.net mvc 4 使用simplemembership在新的MVC 4 Internet模板中进行基于角色的身份验证,asp.net-mvc-4,roles,simplemembership,Asp.net Mvc 4,Roles,Simplemembership,我喜欢MVC4 internet模板中新的simplemembership功能,它带有指向OAuth的链接,用于VS 2012 RTM中的外部登录。在大多数情况下,身份验证功能正在发挥作用。然而,即使花了8个多小时在这上面,我也无法实现基于角色的授权来在我的控制器上工作。事实证明,SimpleMembership一点也不简单 我搜索过stackoverflow,谷歌搜索过,读过最新的作者,尝试过很多建议,但仍然无法解决这个问题。这一切都是从获取Sql连接错误开始的,无法理解为什么连接字符串和其他

我喜欢MVC4 internet模板中新的simplemembership功能,它带有指向OAuth的链接,用于VS 2012 RTM中的外部登录。在大多数情况下,身份验证功能正在发挥作用。然而,即使花了8个多小时在这上面,我也无法实现基于角色的授权来在我的控制器上工作。事实证明,SimpleMembership一点也不简单

我搜索过stackoverflow,谷歌搜索过,读过最新的作者,尝试过很多建议,但仍然无法解决这个问题。这一切都是从获取Sql连接错误开始的,无法理解为什么连接字符串和其他一切都很好。花了好几个小时才发现问题的根源是角色类

控制器上的[Authorize]属性与以前一样用于基本身份验证。但是,每当我尝试使用角色时,它都会给出sql连接错误(因为它会还原为旧的DefaultRoleProvider,它尝试连接到默认的SqlExpress aspnetdb文件,但失败)。比如:

[Authorize(Roles="admin")]
不起作用。如果我回到旧的asp.net成员资格提供程序,它将起作用,但随后我将失去简单的数据库表、令牌库确认和恢复、更安全的密码哈希以及更重要的通过OAuth的外部登录

在代码和razor视图中唯一起作用的是

User.IsInRole("admin")
这对于菜单项之类的东西来说是可以的,但是在控制器中的每个动作中实现起来非常麻烦(我不喜欢它一次只测试单个角色)

我将非常感谢任何解决此问题的指导。

找到了一个似乎能解决以下问题的答案:

[Authorize(Roles="admin,editor,publisher")]
如果我还将此添加到主控制器:

 [InitializeSimpleMembership]
由于此属性位于Accounts控制器上,因此SimpleMembership数据库只有在首次使用Accounts控制器(如login/register)后才能初始化。即使当前用户从cookie登录,数据库也不会初始化,因此会抛出错误。一种解决方案是将此属性放在主控制器上,当我启动我的网站时会调用主控制器。但是,它需要放在每个控制器上,因为我检查角色并根据角色显示不同的菜单项

这是一个糟糕的设计,因为数据库应该在应用程序启动时初始化,而不是在首次使用时初始化

我确实试着把

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Global.asax
应用程序中_Start()
,它负责使用
User.IsInRole(“admin”)
在菜单项中检查角色,但随后使用
[Authorize(Roles=“admin”)]
属性在任何控制器中抛出错误,即使应用了附加属性
[InitializeSimpleMembership]

因此,现在的解决方案是将“[InitializeSimpleMembership]”放在所有控制器上,因为用户最初可以使用外部链接登录任何页面

它仍然不知道如何初始化SimpleRolesProvider类来执行更多的角色管理,而不仅仅是
User.IsInRole()

这些东西在webmatrix网页站点中运行得更好,显然MVC端口并不完整。它与默认的asp.net成员资格提供程序冲突并混淆

编辑 好的,我不认为可以通过将这一行放入App\u Start文件夹中的
FilterConfig.cs
全局应用
[InitializeSimpleMembership]
过滤器:

filters.Add(new InitializeSimpleMembershipAttribute());
这就解决了这个问题。现在需要一个SimpleRolesProvider初始化解决方案,否则我将不得不编写自己的角色提供程序

更新: 这解决了我所有的问题

通过将其包含在web.config中:

<roleManager enabled="true" defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider,               WebMatrix.WebData"/>
  </providers>      
</roleManager>
<membership defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider,                          WebMatrix.WebData"/>
  </providers>
</membership>

当我将我的web应用程序从VS2010/MVC3移动到VS2012/MVC4时,我也遇到了同样的问题

而且无法使[InitializeSimpleMembership]工作

发现将其添加到web.config中可以实现以下目的:

  <appSettings>
    <add key="enableSimpleMembership" value="false" />
  </appSettings>


一切都像以前一样正常。

必须提到,上面的配置内容应该在节中。谢谢艾哈迈德,你让我免于了头痛!谢谢你,先生。您不知道这对我有多大帮助。对于基于角色的身份验证,例如,当使用
[Authorize(Roles=“Admin”)]
时,如果用户已登录但未初始化Web安全性,则会出现错误,因为授权筛选器首先运行。将
InitializeSimpleMembership属性设置为
IAAuthorizationFilter
  <appSettings>
    <add key="enableSimpleMembership" value="false" />
  </appSettings>