MVC授权 - 多个登录页面

问题描述 投票:8回答:3

我在MVC控制器中有以下方法,当用户未登录时,该方法重定向到登录页面。

[Authorize]
public ActionResult Search() {
  return View();
}

[Authorize]
public ActionResult Edit() {
  return View();
}

是否有快速/简单/标准的方法将第二个操作重定向到web.config文件中定义的页面以外的其他登录页面?

或者我必须做类似的事情

public ActionResult Edit() {
  if (IsUserLoggedIn)
    return View();
  else 
     return ReturnRedirect("/Login2");
}
asp.net-mvc
3个回答
19
投票

我认为可以通过创建自定义授权过滤器:

public class CustomAuthorization : AuthorizeAttribute
{
    public string LoginPage { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.HttpContext.Response.Redirect(LoginPage);
        }
        base.OnAuthorization(filterContext);
    }
}

在你的行动中:

[CustomAuthorization(LoginPage="~/Home/Login1")]
public ActionResult Search() 
{
  return View();
}

[CustomAuthorization(LoginPage="~/Home/Login2")]
public ActionResult Edit() 
{
  return View();
}

1
投票

基于Web.config的表单身份验证没有内置的这种功能(这适用于WinForms和MVC)。你必须自己处理它(通过HttpModule或ActionFilter,你提到的方法或任何其他方法)


0
投票

我实现了user434917接受的答案,即使我被正确地重定向,我也收到错误“服务器无法在发送HTTP标头后设置状态”。在服务器日志中。搜索之后,我找到了解决问题的this post(由Mattias Jakobsson回答)。我把答案结合起来得到了这个解决方案。

创建自定义授权过滤器:

using System.Web.Mvc;
using System.Web.Routing;

namespace SomeNamespace.CustomFilters
{
    public class CustomAuthorization : AuthorizeAttribute
    {
        public string ActionValue { get; set; }
        public string AreaValue { get; set; }
        public string ControllerValue { get; set; }

        public override void OnAuthorization(AuthorizationContext context)
        {
            base.OnAuthorization(context);

            if (context.HttpContext.User.Identity.IsAuthenticated == false)
            {
                var routeValues = new RouteValueDictionary();
                routeValues["area"] = AreaValue;
                routeValues["controller"] = ControllerValue;
                routeValues["action"] = ActionValue;
                context.Result = new System.Web.Mvc.RedirectToRouteResult(routeValues);
            }
        }
    }
}

然后在您的控制器上,使用customer属性。

[CustomAuthorization(ActionValue = "actionName", AreaValue = "areaName", ControllerValue = "controllerName")]
public class SomeControllerController : Controller
{
    //DO WHATEVER
}
© www.soinside.com 2019 - 2024. All rights reserved.