如何在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>              
                }
            }