【问题标题】:Authorize(Roles = "Admins") causes infinite loop in MVC5 Identity 2Authorize(Roles = "Admins") 导致 MVC5 Identity 2 中的无限循环
【发布时间】:2016-02-29 08:30:13
【问题描述】:

我们有一个 MVC 5 Identity 2 项目。如何限制管理员对控制器的访问?当 Admin 用户访问下面的控制器时,会提示他们登录,但是通过 CTOR 会出现无限循环

[Authorize(Roles = "Admins")]
public class AdminController : Controller
{
    private ApplicationSignInManager _signInManager;
    private ApplicationUserManager _userManager;

    public AdminController()
    {
    }
    public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
    {
        UserManager = userManager;
        SignInManager = signInManager;
    }

    public ApplicationSignInManager SignInManager
    {
        get
        {
            return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
        }
        private set
        {
            _signInManager = value;
        }
    }

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

但是,如果我将 [Authorize(Roles = "Admins")] 更改为 [Authorize],它可以正常工作。如何限制管理员访问此控制器?

【问题讨论】:

  • 也许您的角色名称是“Admin”而不是“Admins”。
  • 谢谢@tmg,但角色绝对是管理员。

标签: asp.net-mvc asp.net-identity


【解决方案1】:

我找到了解决方案here

我没有意识到RoleManager 默认情况下不会启动。到ConfigureAuth 我添加了这一行app.CreatePerOwinContext&lt;ApplicationRoleManager&gt;(ApplicationRoleManager.Create);

IdentityConfig.cs我加了

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
        : base(roleStore)
    {
    }

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        var appRoleManager = new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<CustomersContext>()));

        return appRoleManager;
    }
}

然后将RoleManager注入AdminController的构造函数

private ApplicationRoleManager _roleManager;
public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager,
ApplicationRoleManager roleManager)
    {
        UserManager = userManager;
        SignInManager = signInManager;
        RoleManager = roleManager;
    }

    public ApplicationRoleManager RoleManager
    {
        get
        {
            return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
        }
        private set { _roleManager = value; }
    }

一切都是票子-嘘

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2021-05-07
    • 2012-08-24
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多