【问题标题】:setting user access to every app in asp.net mvc在 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 的帐户

【问题讨论】:

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

标签: c# asp.net-mvc user-roles


【解决方案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 表连接以获取效果。

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2012-09-24
    相关资源
    最近更新 更多