在我的ASP.NET MVC 5应用程序中,我们有许多用户角色,例如Admin,ReportUser,ProjectManager和类似的东西。我希望应用程序根据以下规则在登录后立即将用户重定向到视图:
如果用户是管理员,请重定向到/ Admin / Index
如果用户是ReportUser,请重定向到/ Report / Index
如果用户是ProjectManager,则重定向到/ Project / Index
我已经在web.config中使用AspNetWindowsTokenRoleProvider设置了一个角色管理器,我在global.asax的MyMvcApplication_PostAuthenticateRequest中设置了用户角色,效果很好。
但是,我不清楚在何处以及进行重定向的最佳方式是什么。在自定义授权属性类的OnAuthorization方法中?或者在global.asax的MyMvcApplication_PostAuthenticateRequest方法中?
答案 0 :(得分:1)
如果您使用默认的Asp.net身份登录和模板逻辑,则应该有一个类似于以下内容的登录方法:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindAsync(model.Email, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
所以创建一个新方法:
public async Task<ActionResult> GoHome()
{
if (this.User.IsInRole("Admin"))
{
return Redirect("Action", "Controller");
}
// etc etc
}
然后只需更改:
即可更新Login方法return RedirectToLocal(returnUrl);
到
return Redirect("GoHome");
双重定向的原因是认证发生在MVC管道之前,这意味着await SignInAsync(user, model.RememberMe)
不会更改当前用户上下文,它需要重定向MVC才能看到更改。因此,在下一页上,它可以读取角色并正确重定向。