在使用简单成员的新的MVC 4互联网模板中基于angular色的authentication

我喜欢MVC 4互联网模板中的新简单会员function,并在VS 2012 RTM中提供了与外部login相关的OAuth链接。 大部分身份validationfunction正在工作。 但是,即使花费了8个多小时,我也无法实现基于angular色的授权,以在我的控制器上工作。 SimpleMembership变成了简单的东西。

我已经search了stackoverflow,googlesearch,并阅读约翰·加洛韦的最新,尝试了很多build议,仍然无法解决这个问题。 这一切都开始得到Sql连接错误,不知道为什么当连接string和其他一切都很好。 花了好几个小时才弄清楚这是导致问题的angular色类。

控制器上的[Authorize]属性与之前的基本authentication一样。 但是任何时候我尝试使用angular色它给sql连接错误(因为它恢复到旧的DefaultRolesProvider,它试图连接到默认的SqlExpress aspnetdb文件并失败)。 所以像这样:

[Authorize(Roles="admin")] 

不起作用。 这将工作,如果我回到旧的asp.net会员提供商,但然后我失去了简单的数据库表,令牌基础确认和恢复,更安全的密码散列,更重要的是通过OAuth的外部login。

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

 User.IsInRole("admin") 

这对于菜单项等是可以的,但是在控制器的每一个Action里面实现起来很麻烦(我不喜欢它一次只testing一个angular色)。

我将不胜感激任何指导来解决这个问题。

Mehdi Golchin在这里find了一个答案,似乎照顾:

 [Authorize(Roles="admin,editor,publisher")] 

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

  [InitializeSimpleMembership] 

由于这个属性在账户控制器上,所以SimpleMembership数据库只有在第一次使用账户控制器(如login/注册)后才能初始化。 即使当前用户从cookie中login,数据库也不会被初始化,所以会引发错误。 一个解决scheme是把这个属性放在我启动我的网站时被调用的家庭控制器上。 但是,因为我检查angular色并根据angular色显示不同的菜单项,所以需要将其放置在每个控制器上。

这是不好的devise,因为数据库应该在App_Start上初始化,而不是在第一次使用时初始化。

我确实尝试了

 WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 

Global.asax Application_Start() ,它负责使用User.IsInRole("admin")在菜单项中进行angular色检查,但是随后在任何控制器中使用[Authorize(Roles="admin")]属性抛出错误,甚至附加属性[InitializeSimpleMembership]被应用。

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

它仍然无法确定如何初始化SimpleRolesProvider类来执行更多的angular色pipe理,而不仅仅是User.IsInRole()

这些东西在webmatrix网页的网站上工作得更好,显然MVC的端口还不完整。 它冲突,并与默认的asp.net会员提供商混淆。

编辑确定我没有想到[InitializeSimpleMembership]filter可以通过将该行放在App_Start文件夹的FilterConfig.cs全局应用:

 filters.Add(new InitializeSimpleMembershipAttribute()); 

这照顾到了这个问题。 现在需要SimpleRolesProvider初始化的解决scheme,否则我将不得不编写自己的angular色提供者。

更新:

Scott Allen的这篇文章解决了我所有的问题。

通过将其包含在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> 

所有angular色和成员资格类的方法变得可用,并可以在代码中初始化如下:

 var roles = (SimpleRoleProvider) Roles.Provider; var membership = (SimpleMembershipProvider) Membership.Provider; 

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

无法使[InitializeSimpleMembership]正常工作。

发现把这个添加到你的web.config中有诀窍:

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

和以前一样,一切正常。