Asp.net mvc 基于角色的ASP.NET MVC登录和重定向
我正在使用ASP.NET MVC生成的默认登录方法,并希望对其进行更改,以便根据用户的角色将其重定向到指定的视图。我已检查用户是否处于该角色。我在SignInStatus成功块中进行了重定向,但没有成功 我在其他代码块中使用Asp.net mvc 基于角色的ASP.NET MVC登录和重定向,asp.net-mvc,authentication,Asp.net Mvc,Authentication,我正在使用ASP.NET MVC生成的默认登录方法,并希望对其进行更改,以便根据用户的角色将其重定向到指定的视图。我已检查用户是否处于该角色。我在SignInStatus成功块中进行了重定向,但没有成功 我在其他代码块中使用User.IsInRole(),效果很好。我认为用户在执行if语句时没有完全登录。我认为情况就是这样,但我不确定我能实施什么工作 下面是我的代码 // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateCust
User.IsInRole()
,效果很好。我认为用户在执行if语句时没有完全登录。我认为情况就是这样,但我不确定我能实施什么工作
下面是我的代码
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateCustomAntiForgeryTokenAttribute]
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);
switch (result)
{
case SignInStatus.Success:
if (User.IsInRole("Customer"))
{
return RedirectToAction("Customer", "Home");
}
else if (User.IsInRole("Requestor"))
{
return RedirectToAction("Caterer", "Home");
}
else if (User.IsInRole("Admin"))
{
return RedirectToAction("Admin", "Home");
}
else
{
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);
}
}
//POST:/Account/Login
[HttpPost]
[异名]
[ValidateCustomAntiForgeryTokenAttribute]
公共异步任务登录(LoginView模型,字符串返回URL)
{
如果(!ModelState.IsValid)
{
返回视图(模型);
}
//这不会将登录失败计入帐户锁定
//要使密码失败触发帐户锁定,请更改为shouldLockout:true
var result=wait SignInManager.PasswordSignInAsync(model.Email、model.Password、model.RememberMe、shouldllockout:false);
开关(结果)
{
案例标志状态成功:
if(User.IsInRole(“客户”))
{
返回重定向到操作(“客户”、“主页”);
}
else if(User.IsInRole(“请求者”))
{
返回活动(“餐饮服务商”、“家”);
}
else if(User.IsInRole(“Admin”))
{
返回重定向到操作(“管理”、“主页”);
}
其他的
{
返回重定向到本地(returnUrl);
}
案例标志状态锁定输出:
返回视图(“锁定”);
案例标志状态。要求验证:
return RedirectToAction(“SendCode”,new{ReturnUrl=ReturnUrl,RememberMe=model.RememberMe});
案例信号状态故障:
违约:
AddModelError(“,”登录尝试无效“);
返回视图(模型);
}
}
你是对的。此处引用的用户对象由ASP.NET管道中的“身份验证”步骤设置。有关这方面的更多信息,请查看
PasswordSignInAsync
仅验证您的用户并为将来的请求设置身份验证cookie。它不影响用户对象,用户对象仍然表示通过管道输入的未经验证的状态
实现所需功能的一个简单方法是将登录方法重定向到另一个操作(类似于RedirectUser),该操作随后执行基于角色的路由。此方法将具有对经过身份验证的用户对象和IsInRole
方法的完全访问权限
或者,您可以实现自己的
User.IsInRole
方法,直接查询数据库 多亏了@stephen.vakil的链接,我通过更改SignInStatus.Success案例中的代码块成功地使它工作起来
case SignInStatus.Success:
var user = await UserManager.FindAsync(model.Email, model.Password);
var roles = await UserManager.GetRolesAsync(user.Id);
if (roles.Contains("Customer"))
{
return RedirectToAction("Customer", "Home");
}
else if (roles.Contains("Requestor"))
{
return RedirectToAction("Caterer", "Home");
}
else if (roles.Contains("Admin"))
{
return RedirectToAction("Admin", "Home");
}
else
{
return RedirectToLocal(returnUrl);
}
......
如果您想使用asp.net身份的默认登录名,那么在成功获得结果后,您应该获得这样的角色,然后重定向将解决此问题
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
var userId = SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.GetUserId();
if (UserManager.IsInRole(userId, "Super Admin"))
{
return RedirectToAction("Index", "DashBoard");
}}
[HttpPost]
公共异步任务登录([FromForm]LoginDto userDto,字符串returnUrl)
{
if(ModelState.IsValid)
{
//var googlerepactcha=\u googlerepactchasservice.ResponceVerify(userDto.repactchatoken);
//如果(!googlerepactcha.Result.success&&googlerepactcha.Result.score视图(“登录”);
//}
var signedUser=await userManager.findbyemailsync(userDto.Email);
var result=wait signInManager.PasswordSignInAsync(signedUser.Email、userDto.Password、userDto.RememberMe、lockoutOnFailure:false);
if(result.successed)
{
如果(!string.IsNullOrEmpty(returnUrl)和&Url.islocalur(returnUrl))
{
返回LocalRedirect(returnUrl);
}
其他的
{
var roles=await userManager.GetRolesAsync(signedUser);
if(roles.Contains(“超级管理员”))
返回重定向操作(“仪表板”、“用户”);
if(roles.Contains(“数据输入操作员”))
返回重定向到操作(“业务列表”、“业务”);
if(roles.Contains(“业务管理员”))
返回重定向到操作(“我的业务”、“业务”);
}
}
AddModelError(string.Empty,“无效登录尝试”);
}
返回等待任务。运行(()=>View(userDto));
}
可能相关:
[HttpPost]
public async Task<IActionResult> SignIn([FromForm]LoginDto userDto, string returnUrl)
{
if (ModelState.IsValid)
{
//var googlereCaptcha = _googlereCaptchaService.ResponceVerify(userDto.ReCaptchaToken);
//if (!googlereCaptcha.Result.success && googlereCaptcha.Result.score <= 0.5)
//{
// TempData["LoginSuccessMsg"] = "You are not Human.";
// return await Task.Run(() => View("SignIn"));
//}
var signedUser = await userManager.FindByEmailAsync(userDto.Email);
var result = await signInManager.PasswordSignInAsync(signedUser.Email, userDto.Password, userDto.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
{
return LocalRedirect(returnUrl);
}
else
{
var roles = await userManager.GetRolesAsync(signedUser);
if (roles.Contains("Super Admin"))
return RedirectToAction("Dashboard", "User");
if (roles.Contains("Data Entry Operator"))
return RedirectToAction("BusinessList", "Business");
if (roles.Contains("Business Admin"))
return RedirectToAction("MyBusiness", "Business");
}
}
ModelState.AddModelError(string.Empty, "Invalid Login Attempt");
}
return await Task.Run(() => View(userDto));
}