在 asp.net mvc 中设置用户对每个应用程序的访问权限

Posted

技术标签:

【中文标题】在 asp.net mvc 中设置用户对每个应用程序的访问权限【英文标题】:setting user access to every app in asp.net mvc 【发布时间】:2018-12-30 14:57:29 【问题描述】:

这是我的代码,我不知道为什么它总是执行 else 语句,即使我登录了具有 SuperAdmin 角色的用户

 [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    
        if (!ModelState.IsValid)
        
            return View(model);
        

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

        if (User.IsInRole("SuperAdmin"))
        
            switch (result)
            
                case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);
                case SignInStatus.LockedOut:
                    return View("Lockout");
                case SignInStatus.RequiresVerification:
                    return RedirectToAction("SendCode", new  ReturnUrl = returnUrl, RememberMe = model.RememberMe );
                case SignInStatus.Failure:
                default:
                    ModelState.AddModelError("", "Invalid login attempt.");
                    return View(model);
            
        

        else
        
            ModelState.AddModelError("", "you are not allowed to access this page");
            //AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
            return View(model);
        

    

给我一​​些建议,我应该对我的代码做些什么来改进它.. 我的问题是为什么我的代码总是执行 else 语句,即使我使用 SuperAdmin 的帐户

【问题讨论】:

如果您使用带有身份的实体框架,请检查您的数据库角色配置? 我正在使用我的数据库,但仍然无法获取设置可以访问特定应用程序的用户角色的正确代码 【参考方案1】:

听起来像if 检查当前用户角色的语句应该被移动。在继续进行用户角色检查之前,请确保当前用户是否成功登录,因为在点击PasswordSignInAsync方法后,用户可能仍未完成所有身份验证过程。

如果您使用的是较新版本的 Identity,请改用 UserManager.IsInRole 方法,因为 User.IsInRole 使用旧版本的角色管理器:

var user = await UserManager.FindAsync(model.Email, model.Password);
if (UserManager.IsInRole(user.Id, "SuperAdmin"))

    // do something

以下是用户角色检查的示例设置:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

    if (!ModelState.IsValid)
    
        return View(model);
    

    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

    switch (result)
    
        case SignInStatus.Success:
             var user = await UserManager.FindAsync(model.Email, model.Password);

             if (user == null)
             
                 // user not found or login failure, do something here
             
             else 
             
                 // proceed to role checking
                 var roles = await UserManager.GetRolesAsync(user.Id);

                 // use roles.Contains("SuperAdmin") if IsInRole still won't work 
                 if (UserManager.IsInRole(user.Id, "SuperAdmin"))
                 
                     return RedirectToLocal(returnUrl);
                 
                 else
                 
                     ModelState.AddModelError("", "you are not allowed to access this page");
                     return View(model);
                 
                   

             break;
        case SignInStatus.LockedOut:
             return View("Lockout");
        case SignInStatus.RequiresVerification:
             return RedirectToAction("SendCode", new  ReturnUrl = returnUrl, RememberMe = model.RememberMe );
        case SignInStatus.Failure:
        default:
             ModelState.AddModelError("", "Invalid login attempt.");
    

    return View(model);

注意:确保 web.config 中的roleManager 设置已正确设置和/或Roles 表已与数据库中的Users 表连接以获取效果。

【讨论】:

以上是关于在 asp.net mvc 中设置用户对每个应用程序的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

在 asp .net CORE / MVC 6 应用程序中设置 Swagger 时出现 500 错误

在 asp.net MVC 中设置整数标头值

如何使用 ASP.NET MVC 应用程序在 firebase 实时数据库中设置数据

在 ASP.NET MVC 中设置默认 JSON 序列化程序

在 ASP.NET MVC 项目中设置具有不同帐户和视图的多个公司的最佳实践

在 Asp.Net MVC 中设置“主页”