MVC авторизация - несколько страниц входа - PullRequest
8 голосов
/ 29 мая 2009

У меня есть следующие методы в контроллере 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");
}

Ответы [ 3 ]

19 голосов
/ 29 мая 2009

Я думаю, что это возможно, создав специальный фильтр авторизации:

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 голос
/ 29 мая 2009

Web.config проверка подлинности на основе форм не имеет такой встроенной функциональности (это относится как к WinForms, так и к MVC). Вы должны справиться с этим самостоятельно (через HttpModule или ActionFilter, метод, который вы упомянули, или любым другим методом)

0 голосов
/ 12 апреля 2019

Я реализовал принятый ответ от пользователя user434917 и, несмотря на то, что меня перенаправили правильно, я также получил сообщение об ошибке «Сервер не может установить статус после отправки заголовков HTTP». в журнале сервера. После поиска я нашел этот пост (ответ Маттиаса Якобссона), который решил проблему. Я объединил ответы, чтобы получить это решение.

Создание пользовательского фильтра авторизации:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...