2017-01-11 53 views
5

Pracuję nad aplikacją internetową MVC5. Ta aplikacja ma 2 obszary, "SU" i "App". Każdy obszar powinien być uwierzytelniany niezależnie. Każdy obszar ma również własne strony logowania.
Używam OWIN do uwierzytelniania użytkowników.
Problem polega na tym, że nie mogę ustawić wartości CookieAuthenticationOptionsLoginPath w zależności od obszaru, o który prosi użytkownik.
Na przykład, jeżeli żądanie użytkownika http://example.com/su/reports/dashboard, że powinienem być w stanie przekierować je do http://example.com/su/auth/login
Podobnie, dla obszaru „app”, jeżeli żądanie użytkownika http://example.com/app/history/dashboard, powinienem być w stanie przekierować je do http://example.com/app/auth/loginUwierzytelnianie w oparciu o obszar przy użyciu OWIN

chciałbym aby uniknąć atrybut niestandardowy i dlatego próbował następujący kod, ale to jest zawsze przekierowanie do ścieżki korzeń logowania tj http://example.com/auth/login

public partial class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var url = HttpContext.Current.Request.Url.AbsoluteUri; 
      string loginPath = "/auth/login"; 
      string areaName = string.Empty; 
      if (url.ToLower().Contains("/su/")) 
      { 
       areaName = "SU"; 
       loginPath = "/su/auth/login"; 
      } 
      if (url.ToLower().Contains("/app/")) 
      { 
       areaName = "APP"; 
       loginPath = "/app/auth/login"; 
      } 
      app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = "ApplicationCookie" + areaName, 
       LoginPath = new PathString(loginPath) 
      }); 
     } 
} 

jestem po właściwej podejście czy jest jakiś inny sposób na osiągnięcie tego samego? Dzięki!

Odpowiedz

2

CookieAuthenticationOptions.LoginPath Właściwość jest ustawiana tylko raz podczas uruchamiania. Aby użyć innego adresu URL na podstawie żądania, można użyć niestandardowej implementacji ICookieAuthenticationProvider ustawionej za pomocą CookieAuthenticationOptions.Provider lub po prostu ustawić niestandardową akcję dla OnApplyRedirect w wbudowanym CookieAuthenticationProvider. Druga opcja jest prostsza i wydaje się wystarczająca dla twojej sprawy.

Oto przykładowy kod:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = "ApplicationCookie", 
    LoginPath = new PathString("/auth/login"), 
    Provider = new CookieAuthenticationProvider { OnApplyRedirect = OnApplyRedirect } 
}); 

public static void OnApplyRedirect(CookieApplyRedirectContext context) 
{ 
    var url = HttpContext.Current.Request.Url.AbsoluteUri; 

    string redirectUrl = "/auth/login"; 
    if (url.ToLower().Contains("/su/")) 
    { 
     redirectUrl = "/su/auth/login"; 
    } 
    else if (url.ToLower().Contains("/app/")) 
    { 
     redirectUrl = "/app/auth/login"; 
    } 

    context.Response.Redirect(redirectUrl); 
}