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

Ahm*_*med 53 roles asp.net-mvc-4 simplemembership

我喜欢MVC 4互联网模板中的新简单会员功能,其中包含指向VS 2012 RTM中外部登录的OAuth的链接.在大多数情况下,身份验证功能正常运行 然而,即使花了超过8个小时,我也无法实现基于角色的授权来操作我的控制器.SimpleMembership变得简单.

我已搜查计算器,用Google搜索和阅读已通过最新的约翰·加洛韦,尝试了很多的建议,仍然没有能够resovle这个问题.这一切都始于获取Sql连接错误,无法弄清楚为什么连接字符串和其他一切都很好.需要花费很多时间才能弄清楚Roles类是否会导致问题.

控制器上的[Authorize]属性与以前一样用于基本身份验证.但是每当我尝试使用Roles时,它都会给出sql连接错误(因为它会恢复到旧的DefaultRolesProvider,它会尝试连接到默认的SqlExpress aspnetdb文件并失败).所以类似于:

[Authorize(Roles="admin")]
Run Code Online (Sandbox Code Playgroud)

不起作用.如果我回到旧的asp.net成员资格提供程序,它会工作,但后来我丢失了简单的数据库表,令牌库确认和恢复,更安全的密码哈希,更重要的是通过OAuth进行外部登录.

在代码和剃刀视图中唯一有用的是

User.IsInRole("admin")
Run Code Online (Sandbox Code Playgroud)

这对于菜单项等是可以的,但是在控制器中的每个Action中实现都很麻烦(我不喜欢它一次只测试单个角色).

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

Ahm*_*med 69

在这里找到了Mehdi Golchin的答案,似乎要照顾:

[Authorize(Roles="admin,editor,publisher")]
Run Code Online (Sandbox Code Playgroud)

如果我还将其添加到家庭控制器:

 [InitializeSimpleMembership]
Run Code Online (Sandbox Code Playgroud)

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

这是糟糕的设计,因为数据库应该在App_Start上初始化,而不是在第一次使用时.

我确实尝试过

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Run Code Online (Sandbox Code Playgroud)

Global.asax Application_Start(),它负责使用菜单项中的角色检查User.IsInRole("admin"),但随后在具有[Authorize(Roles="admin")]属性的任何控制器中抛出错误,即使应用了其他属性[InitializeSimpleMembership].

所以现在解决方案是在所有控制器上放置`[InitializeSimpleMembership],因为用户可能最初使用外部链接登陆任何页面.

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

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

编辑 确定我不认为[InitializeSimpleMembership]过滤器可以通过将此行放在FilterConfig.csApp_Start文件夹中来全局应用:

filters.Add(new InitializeSimpleMembershipAttribute());
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.现在需要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>
Run Code Online (Sandbox Code Playgroud)

角色和成员资格类的所有方法都可用,可以在代码中初始化,如下所示:

var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;
Run Code Online (Sandbox Code Playgroud)

  • 不得不提的是,上面的配置内容应该在<system.web>部分内. (7认同)

keu*_*eun 6

当我将我的Web应用程序从VS2010/MVC3移动到VS2012/MVC4时出现同样的问题.

并且无法使[InitializeSimpleMembership]工作.

发现将此添加到您的web.config可以解决问题:

  <appSettings>
    <add key="enableSimpleMembership" value="false" />
  </appSettings>
Run Code Online (Sandbox Code Playgroud)

一切都像以前一样运作良好.