在这里找到了 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 网页站点中效果更好,显然 MVC 端口并不完整。它与默认的 asp.net 会员提供程序发生冲突并混淆。
编辑
好的我不认为[InitializeSimpleMembership]
可以通过将此行放在FilterConfig.cs
App_Start 文件夹中来全局应用过滤器:
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;