【问题标题】:RoleManager and SimpleMembershipProvider cannot be used with AuthorizeAttributeRoleManager 和 SimpleMembershipProvider 不能与 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 感谢您的帮助,但我明确提到我可以通过代码访问我的角色,但只有在尝试使用该属性时才会出现错误。请再次完整阅读该问题。谢谢。
  • 您可以随心所欲地说,但如果不提供有关您如何连接到数据库的信息,没有人可以告诉您您做错了什么。

标签: asp.net simplemembership asp.net-mvc-5 asp.net-identity role-manager


【解决方案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。

    【讨论】:

    • 有文章/教程的链接可以发给我吗?我会很感激的。
    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2020-04-15
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2013-04-10
    相关资源
    最近更新 更多