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

web.config 中没有 roleManager 标签

使用 MVC 错误配置 roleManager 提供程序

尝试将RoleManager注入ASP.NET Core 2.2控制器时出现错误

roleManager与角色管理授权

aspnetdb 添加角色和用户