2015-11-25 3 views
3

Я долгое время искал решение этой проблемы, но, к сожалению, не нашел ни одного красивого и элегантного способа справиться с этим.MVC 6 Области и несколько страниц входа в систему redirect

Вот подробности:

  1. Мои MVC 6 Использование приложений Области. Каждая область имеет отдельные каталоги для контроллеров, представлений и т.д.

  2. Аутентификация на основе стандарта из шаблона веб-приложений окно с учетными записями пользователей, хранящейся в SQL сервере

  3. То, что я хочу, чтобы достичь является:

    • Когда пользователь входит в/AreaA/Restricted/Page, то он перенаправляется в/AreaA/Account/Вход
    • Когда пользователь вводит/AreaB/Restricted/Page то он перенаправляется в/AreaB/Account/Вход и т.д. ..
  4. Несмотря на то, что я могу изменить страницу stanard входа в систему перенаправления с «/ Account/Войти» в нечто иное, как это:

    services.Configure<IdentityOptions>(options=> { 
        options.Cookies.ApplicationCookie.LoginPath = 
         new Microsoft.AspNet.Http.PathString("/HardcodedAreaName/Account/Login"); 
    }); 
    

Я не могу перенаправить в различные действия/входа страниц для каждой области.

До MVC 6 я был в состоянии использовать AuthorizeAttribute с параметром URL:

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

     // redirect to login page with the original url as parameter. 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      filterContext.Result = new RedirectResult(Url + "?returnUrl=" + filterContext.HttpContext.Request.Url.PathAndQuery); 
     } 

    } 

, а затем передавая область зависимую URL украшая каждый контроллер:

[CustomAuthorization(Url = "/Admin/Account/Login"] 
public class AdminAreaController : Controller 
{ ... 

Но это больше не работает :(

+0

ли вы когда-нибудь в конечном итоге заставить это работать? Как вы вносили изменения в метод 'Configure', поскольку' services' недоступен? –

ответ

2

Попробуйте следующее и посмотрите, работает ли оно (я пробовал это, и все работает отлично, но не уверен. Если бы я покрыл все сценарии):

Место, где вы регистрируетесь вам CookieAuthentication промежуточное программное обеспечение, вы можете сделать что-то вроде

app.UseCookieAuthentication(o => 
{ 
    o.LoginPath = "/area1/login1"; 
    o.AuthenticationScheme = "scheme1"; 
    //TODO: set other interesting properties if you want to 
}); 

app.UseCookieAuthentication(o => 
{ 
    o.LoginPath = "/area2/login2"; 
    o.AuthenticationScheme = "scheme2"; 
    //TODO: set other interesting properties if you want to 
}); 

На вас контроллер/действие, указать scheme..example аутентификации:

[Authorize(ActiveAuthenticationSchemes = "scheme1")] 
public IActionResult Test1() 
{ 
    return Content("Test1"); 
} 

[Authorize(ActiveAuthenticationSchemes = "scheme2")] 
public IActionResult Test2() 
{ 
    return Content("Test2"); 
} 
+0

Hi Kiran. Спасибо за ваши усилия. Решение, которое вы предложили, практически прекратилось, за исключением одного ... При попытке настроить cookie-аутентификацию так, как вы предлагали, сохраняется только последний вариант. Так что, если я так: app.UseCookieAuthentication (о => {o.LoginPath = "/ area1/login1"; o.AuthenticationScheme = "scheme1";}); {o.LoginPath = "/ area2/login2"; o.AuthenticationScheme = "схема2";}); schem1/loginpath 1 игнорируются, и приложение может видеть только схему 2 и логин 2. Не могли бы вы точно показать, как вы применили оба параметра в файле Startup.cs? – Konrad

+0

Хм ... Я уже поделился приведенным выше кодом для настройки параметров выше ... Можете ли вы поделиться тем, как выглядит ваш файл Startup.cs? –

+0

Startup.cs общественные недействительный ConfigureServices (услуги IServiceCollection) { ... // "Фронт" область - Эта опция игнорируются services.Configure (о => { o.Cookies.ApplicationCookie .LoginPath = "/ Front/Account/Login"; o.Cookies.ApplicationCookie.AuthenticationScheme = "FrontAuthScheme"; }); // область "Администратор" - Эта опция работает отлично, но перекрывает предыдущий services.Configure (о => { o.Cookies.ApplicationCookie.LoginPath = "/ Admin/Account/Login"; o.Cookies.ApplicationCookie.AuthenticationScheme = "AdminAuthScheme"; }); } – Konrad

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