我在Mehdi Golchin的这里找到了一个答案,似乎可以解决以下问题:
[Authorize(Roles="admin,editor,publisher")]
如果我也在主页控制器中添加这个:
[InitializeSimpleMembership]
因为这个属性在Accounts控制器上,所以SimpleMembership数据库只会在第一次使用账户控制器(如登录/注册)时才会初始化。即使当前用户通过cookie登录,也不会初始化数据库,因此会抛出错误。一个解决方法是将此属性放在主页控制器上,在启动网站时调用。但是,然后需要将其放置在每个控制器上,因为我根据角色检查角色并显示不同的菜单项。
这是糟糕的设计,因为数据库应该在App_Start上初始化,而不是在第一次使用时初始化。
我试过放置
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
在Global.asax
的Application_Start()
方法中,使用User.IsInRole("admin")
检查菜单项的角色,并对任何带有[Authorize(Roles="admin")]
属性的控制器抛出错误,即使应用了额外的[InitializeSimpleMembership]
属性。
因此,现在的解决方案是将`[InitializeSimpleMembership]`放在所有控制器上,因为用户可能最初通过外部链接访问任何页面。
它仍然无法弄清楚如何初始化SimpleRolesProvider类,以执行更多的角色管理,而不仅仅是User.IsInRole()
。
这些东西在webmatrix webpages网站中工作得更好,显然端口到MVC并不完整。 它与默认的asp.net成员资格提供程序冲突并且混淆。
编辑
好吧,我没有想到可以通过将这行放入App_Start文件夹中的FilterConfig.cs
来全局应用[InitializeSimpleMembership]
过滤器:
filters.Add(new InitializeSimpleMembershipAttribute())
现在问题解决了,接下来需要解决SimpleRolesProvider初始化的问题,否则我就得自己编写角色提供程序。
更新:
这篇文章(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>
通过以下方式,Roles和Membership类的所有方法都变得可用,并可以在代码中进行初始化:
var roles = (SimpleRoleProvider) Roles.Provider
var membership = (SimpleMembershipProvider) Membership.Provider
[Authorize(Roles="Admin")]
时,如果用户已登录但WebSecurity未初始化,则会出现错误,因为授权过滤器首先运行。将InitializeSimpleMembershipAttribute
设置为IAuthorizationFilter
,请参见文章。 - edteke