在 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 应用程序在 firebase 实时数据库中设置数据
在 ASP.NET MVC 中设置默认 JSON 序列化程序