找到了答案迈赫迪·戈尔钦 (Mehdi Golchin) 报道这似乎照顾:
[Authorize(Roles="admin,editor,publisher")]
如果我也将其添加到家庭控制器中:
[InitializeSimpleMembership]
由于此属性位于帐户控制器上,因此仅在首次使用帐户控制器(例如登录/注册)后,SimpleMembership 数据库才会初始化。即使当前用户通过 cookie 登录,数据库也不会初始化,因此会抛出错误。一种解决方案是将此属性放在家庭控制器上,当我启动网站时会调用该属性。但是,然后需要将其放置在每个控制器上,因为我检查角色并根据角色显示不同的菜单项。
这是糟糕的设计,因为数据库应该在 App_Start 上初始化,而不是在第一次使用时初始化。
我确实尝试过
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
in the Global.asax
Application_Start()
,并且它负责使用菜单项中的角色检查User.IsInRole("admin")
,但随后在任何控制器中抛出错误[Authorize(Roles="admin")]
属性,即使有附加属性[InitializeSimpleMembership]
被申请;被应用。
因此,现在的解决方案是将“[InitializeSimpleMembership]”放在所有控制器上,因为用户最初可能会使用外部链接登陆任何页面。
它仍然无法弄清楚如何初始化 SimpleRolesProvider 类来执行更多的角色管理而不仅仅是User.IsInRole()
.
这些东西在 webmatrix 网页站点中确实工作得更好,但显然 MVC 的移植并不完整。它与默认的 ASP.NET 成员资格提供程序发生冲突和混淆。
EDIT好吧,我没想到[InitializeSimpleMembership]
可以通过将此行放在全局范围内应用过滤器FilterConfig.cs
在App_Start文件夹中:
filters.Add(new InitializeSimpleMembershipAttribute());
这就解决了这个问题。现在需要一个用于 SimpleRolesProvider 初始化的解决方案,否则我将不得不编写自己的角色提供程序。
UPDATE:
This 斯科特·艾伦发表的文章解决了我所有的问题。
通过将其包含在 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;