繁体   English   中英

Authorize(Roles =“ Admins”)在MVC5 Identity 2中导致无限循环

[英]Authorize(Roles = “Admins”) causes infinite loop in MVC5 Identity 2

我们有一个MVC 5 Identity 2项目。 如何将对控制器的访问权限限制为管理员? 管理员用户访问下面的控制器时,系统会提示他们登录,但是通过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] ,则可以正常工作。 如何将对此控制器的访问限制为管理员?

我在这里找到了解决方案

我没有意识到默认情况下不会启动RoleManager 为了ConfigureAuth我添加了以下行app.CreatePerOwinContext<ApplicationRoleManager>(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; }
    }

一切都是票

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM