找到一个答案here by Mehdi Golchin 似乎可以解决:
[Authorize(Roles="admin,editor,publisher")]
如果我也将它添加到家庭控制器:
[InitializeSimpleMembership]
因为这个属性在 Accounts 控制器上,SimpleMembership 数据库只有在第一次使用帐户控制器(如登录/注册)后才会初始化。即使当前用户从 cookie 登录,数据库也不会初始化,因此会引发错误。一种解决方案是将此属性放在主控制器上,当我启动我的网站时会调用它。但是,它需要放置在每个控制器上,因为我检查角色并根据角色显示不同的菜单项。
这是一个糟糕的设计,因为数据库应该在 App_Start 上初始化,而不是在第一次使用时初始化。
我确实尝试过
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
在Global.asaxApplication_Start() 中,它使用User.IsInRole("admin") 处理菜单项中的角色检查,但随后在具有[Authorize(Roles="admin")] 属性的任何控制器中抛出错误,即使应用了附加属性[InitializeSimpleMembership]。
因此,现在的解决方案是将 `[InitializeSimpleMembership] 放在所有控制器上,因为用户最初可能会使用外部链接登陆任何页面。
它仍然不知道如何初始化 SimpleRolesProvider 类来做更多的角色管理,而不仅仅是User.IsInRole()。
这些东西在 webmatrix 网页站点中效果更好,显然 MVC 端口不完整。它与默认的 asp.net 会员提供程序发生冲突并混淆。
编辑
好的,我不认为 [InitializeSimpleMembership] 过滤器可以通过将此行放在 App_Start 文件夹中的 FilterConfig.cs 中来全局应用:
filters.Add(new InitializeSimpleMembershipAttribute());
这就解决了这个问题。现在需要一个 SimpleRolesProvider 初始化的解决方案,否则我将不得不编写自己的角色提供程序。
更新:
这个post by 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;