1

У меня есть сайт MVC3 с сайтом администратора и общественным сайтом. Контроллеры, представления, модели и т. Д. Для них - в одном и том же проекте MVC. Они разделены таким образом: сайт администратора находится в области MVC3 под названием Admin, а открытый сайт не принадлежит к области, но существует на верхнем уровне. Административный сайт имеет вид входа в систему, и на общедоступном сайте также есть вид входа. В моем файле web.config у меня есть:Несколько страниц входа в систему

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogIn" timeout="2880" /> 
</authentication> 

Теперь, если я доступ к любой странице в общественном месте, что требует проверки подлинности я получаю затраченное на страницу входа в систему государственного сайта, который является большим. Однако, если я получаю доступ к любой странице в области администрирования, которая требует аутентификации, я снова попадаю на страницу входа в общедоступный сайт. Тогда возникает вопрос, как я могу убедиться, что если я нахожусь на странице в области администрирования, которая требует аутентификации, которую я получаю на странице входа администратора?

ответ

6

У меня возникла аналогичная проблема, когда вам нужна локализованная страница входа в систему. создать атрибут пользовательского Авторизовать:

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary 
        { 
          { "language", filterContext.RouteData.Values[ "language" ] }, 
          { "controller", "Account" }, 
          { "action", "LogOn" }, 
          { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
        }); 
     } 
    } 
} 

Просто используйте этот атрибут вместо атрибута Authorize по умолчанию. В вашем случае вы можете проверить URL-адрес запроса и в зависимости от этого перенаправления на соответствующую страницу входа.

2

Вы можете написать собственный атрибут Authorize и переопределить метод HandleUnauthorizedRequest, в котором вы могли бы проверить, был ли запрос выполнен администратором, или нет, и перенаправлять соответственно.

Что-то вдоль линий:

public class MyAuthorizeAttribute: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     var area = filterContext.RequestContext.RouteData.Values["area"] as string; 
     if (string.Equals("admin", area, StringComparison.OrdinalIgnoreCase)) 
     { 
      // if the request was for a resource inside the admin area 
      // redirect to a different login page than the one in web.config 
      // in this particular case we redirect to the index action 
      // of the login controller in the admin area. Adapt this 
      // accordingly to your needs. You could also externalize this 
      // url in the web.config and fetch it from there if you want 

      var requestUrl = filterContext.HttpContext.Request.Url; 
      var urlHelper = new UrlHelper(filterContext.RequestContext); 
      var url = urlHelper.Action(
       "index", 
       "login", 
       new 
       { 
        area = "admin", 
        returnUrl = requestUrl.ToString() 
       } 
      ); 
      filterContext.Result = new RedirectResult(url); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

И теперь использовать этот обычай авторизовать атрибут вместо установленного по умолчанию.

0

Обязательно используйте filterContext.RouteData.DataTokens ["area"]; вместо filterContext.RouteData.Values ​​["area"];

public class AreaAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string LoginController = "Account"; 
    public string LoginAction = "Login"; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      var area = filterContext.RouteData.DataTokens["area"]; 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary 
       { 
        { "area", area}, 
        { "controller", LoginController }, 
        { "action", LoginAction }, 
        { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
       }); 
     } 
    } 

использование так:

[AreaAuthorizeAttribute (LoginController = "AreaLoginController", Роль = "Администратор")]

Смежные вопросы