RoleManager 和 SimpleMembershipProvider 不能与 AuthorizeAttribute 一起使用
Posted
技术标签:
【中文标题】RoleManager 和 SimpleMembershipProvider 不能与 AuthorizeAttribute 一起使用【英文标题】:RoleManager and SimpleMembershipProvider cannot be used with AuthorizeAttribute 【发布时间】:2013-09-21 12:52:46 【问题描述】:我有一个 Asp.Net MVC 5 应用程序。我想使用用户角色来仅授权某些人使用特定操作。我已经像这样更改了我的Web.config
文件:
<roleManager enabled="true"/>
<membership defaultProvider="SimpleMembershipProvider">
<providers>
<clear/>
<add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
</providers>
</membership>
这是我将用户添加到角色的方式:
if (!await Roles.RoleExists(role))
await Roles.CreateRole(new Role(role));
await Roles.AddUserToRole(role, user.Id);
目前,我可以使用以下代码通过代码访问用户的角色:
public static async Task<IEnumerable<string>> GetUserRoles(string username)
if (string.IsNullOrEmpty(username))
return new string[0];
string userId = await Logins.GetUserId(IdentityConfig.LocalLoginProvider, username);
var roles = await Roles.GetRolesForUser(userId);
return roles;
但是,当我尝试使用Authorize
属性来访问角色时,页面会卡住并且没有加载任何内容。
[Authorize(Roles = "Admin")]
public ActionResult Index()
return View(db.Restaurants.ToList());
我在这里做错了什么?
更新:
一段时间后网页会显示这个错误:
【问题讨论】:
问题很清楚。未找到数据库实例。检查您的连接字符串。 @MystereMan 我可以在任何其他情况下使用我的数据库。尝试使用AtuthorizeAttribute
时,数据库如何工作但找不到?
由于您没有提供有关您的数据库的任何信息,我怎么知道?
@MystereMan 感谢您的帮助,但我明确提到我可以通过代码访问我的角色,但只有在尝试使用该属性时才会出现错误。请再次完整阅读该问题。谢谢。
您可以随心所欲地说,但如果不提供有关您如何连接到数据库的信息,没有人可以告诉您您做错了什么。
【参考方案1】:
您不能真正将旧的会员/角色与新的身份系统混为一谈。你需要选择一个或另一个。假设您通过新的身份 API 将用户添加到管理员角色,授权属性应该可以正常工作。
本文底部演示角色Mvc5 tutorial
【讨论】:
我阅读了整个教程。除了我在这里发布的内容之外,它什么也没做。 我在新的身份系统中到处使用 [Authorize] 属性,它似乎工作正常。我错过了什么? authorize 属性对 ClaimsPrincipal.IsInRole 起作用,这对于新的身份系统并不真正特定。 @HaoKung 那篇文章不包括谈论角色(?)的部分。最后一段是唯一提到角色的地方,并且有指向 azure 教程的链接。也许您复制粘贴了错误的链接?我在哪里可以找到关于角色的最新文章/doc/sampleapp?谢谢 Mvc5 教程,在底部,链接到Azure tutorial,后者演示了角色和授权属性。 @Alireza 后者建议通过允许的操作来命名角色,例如CanEdit 或 Editor,而不是按名称,例如管理员或超级用户。【参考方案2】:我有同样的问题,它与你的连接字符串无关。将以下内容添加到您的 web.config:
这是答案:http://blog.luppes.com/2013/12/08/mvc5-authentication-roles-failure/
【讨论】:
【参考方案3】:从 ASP.NET 4.5.1/VS2013 开始,MVC 从 MVC5 开始不再是一个单独的产品,而是现在完全集成到 ASP.NET 中。这是微软新的 One ASP.NET 战略的一部分。
除此之外,微软还开发了一种名为 ASP.NET Identity 的新型身份管理系统,它不使用旧的会员系统。
基本上,如果要使用旧的会员系统,则需要使用 MVC4 或更早版本。如果你想使用 ASP.NET Identity,那么 MVC5。
【讨论】:
有文章/教程的链接可以发给我吗?我会很感激的。以上是关于RoleManager 和 SimpleMembershipProvider 不能与 AuthorizeAttribute 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
在接口中使用 AspNetCore.Identity RoleManager 和 UserManager