如何在MVC5中为区域设置授权
How to set authorize for Areas in MVC5
我创建了一个管理区域。我希望在访问 Admin/Home/Index 之前,您必须在 Admin/Account/Login 登录。所以,我为 HomeController 设置了授权。因为我正在使用 Asp.net 身份,所以为了能够转向 Admin/Account/Login,我在 StartUp.Auth.cs 文件中设置了 LoginPath = new PathString("/Admin/Account/Login")。
但是现在,如果我在客户端为控制器设置授权,它将被重定向到 Admin/Account/Login
如何在一个项目中分离2种授权方式
非常感谢您的帮助。
PS: 我也试过了,但还是不行
MVC4 areas and forms authentication
我不确定我是否完全理解您的意图,但我想您希望在登录后将用户重定向到不同的索引页面?
如果是这样,您有多种选择:
假设您使用的是 MVC5 附带的身份模型:
1 - 在您的 AccountController - 登录操作 (HttpPost)
在var result = await SignInManager.PasswordSignInAsync.....之后
添加类似的内容:
- var user = await UserManager.FindAsync(model.Email, model.Password);
- returnUrl = UserManager.IsInRole(user.Id, "Admin")? “/Admin/Home”:
返回网址;
2- 或者您可以像这样创建一个客户 ActionFilterAttribute(为演示目的而简化但仍然有效的示例):
public class RedirectLoginFilter:ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// First check if authentication succeed and user authenticated:
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
bool IsAdmin = filterContext.HttpContext.User.IsInRole("Admin");
//Then check for user role(s) and assign view accordingly, don't forget the
//[Authorize(Roles = "YourRoleHere")] on your controller / action
if (IsAdmin)
{
filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary
(new
{
area = "Admin",
controller = "Home",
action = "Index"
}));
}
else
{
filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary
(new
{
area = "",
controller = "Home",
action = "Index"
}));
}
}
base.OnActionExecuted(filterContext);
}
现在在所有未识别用户的默认 returnUrl 控制器操作中,即:Home/Index 添加您的自定义 filterActionAttribute :
public class HomeController : Controller
{
[RedirectLoginFilter]
public ActionResult Index()
{
return View();
}
请记住,在最后一个解决方案中,每次您尝试使用管理员角色访问您的 Home/Index 方法时,您将被重定向到管理员索引页面。
如果用户处于特定角色并经过身份验证,您始终可以在导航区域中进行检查,如果没有,则选择显示/隐藏这些特定区域。首先,您可能希望将 [Authorize] 装饰器放在任何必要的控制器上,然后您可以在您的 cshtml 文件中执行此操作,以确保只有管理员才能看到管理区域。
@if (User.Identity.IsAuthenticated)
{
if (User.IsInRole("Admin"))
{
<li>@Html.ActionLink("Admin", "Admin", "Account")</li>
}
}
我创建了一个管理区域。我希望在访问 Admin/Home/Index 之前,您必须在 Admin/Account/Login 登录。所以,我为 HomeController 设置了授权。因为我正在使用 Asp.net 身份,所以为了能够转向 Admin/Account/Login,我在 StartUp.Auth.cs 文件中设置了 LoginPath = new PathString("/Admin/Account/Login")。
但是现在,如果我在客户端为控制器设置授权,它将被重定向到 Admin/Account/Login
如何在一个项目中分离2种授权方式
非常感谢您的帮助。
PS: 我也试过了,但还是不行 MVC4 areas and forms authentication
我不确定我是否完全理解您的意图,但我想您希望在登录后将用户重定向到不同的索引页面? 如果是这样,您有多种选择: 假设您使用的是 MVC5 附带的身份模型:
1 - 在您的 AccountController - 登录操作 (HttpPost)
在var result = await SignInManager.PasswordSignInAsync.....之后 添加类似的内容:
- var user = await UserManager.FindAsync(model.Email, model.Password);
- returnUrl = UserManager.IsInRole(user.Id, "Admin")? “/Admin/Home”: 返回网址;
2- 或者您可以像这样创建一个客户 ActionFilterAttribute(为演示目的而简化但仍然有效的示例):
public class RedirectLoginFilter:ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// First check if authentication succeed and user authenticated:
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
bool IsAdmin = filterContext.HttpContext.User.IsInRole("Admin");
//Then check for user role(s) and assign view accordingly, don't forget the
//[Authorize(Roles = "YourRoleHere")] on your controller / action
if (IsAdmin)
{
filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary
(new
{
area = "Admin",
controller = "Home",
action = "Index"
}));
}
else
{
filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary
(new
{
area = "",
controller = "Home",
action = "Index"
}));
}
}
base.OnActionExecuted(filterContext);
}
现在在所有未识别用户的默认 returnUrl 控制器操作中,即:Home/Index 添加您的自定义 filterActionAttribute :
public class HomeController : Controller
{
[RedirectLoginFilter]
public ActionResult Index()
{
return View();
}
请记住,在最后一个解决方案中,每次您尝试使用管理员角色访问您的 Home/Index 方法时,您将被重定向到管理员索引页面。
如果用户处于特定角色并经过身份验证,您始终可以在导航区域中进行检查,如果没有,则选择显示/隐藏这些特定区域。首先,您可能希望将 [Authorize] 装饰器放在任何必要的控制器上,然后您可以在您的 cshtml 文件中执行此操作,以确保只有管理员才能看到管理区域。
@if (User.Identity.IsAuthenticated)
{
if (User.IsInRole("Admin"))
{
<li>@Html.ActionLink("Admin", "Admin", "Account")</li>
}
}