2017-01-11 6 views
5

私はMVC5 Webアプリケーションを開発しています。このアプリケーションには2つの領域、 'SU'と '' App 'があります。各領域は個別に認証する必要があります。各エリアには独自のログインページもあります。
私はOWINを使用してユーザーを認証しています。
問題は、ユーザーが要求している領域に基づいて、私はowin CookieAuthenticationOptionsLoginPathに設定できません。
例えば、ユーザー要求http://example.com/su/reports/dashboard場合、私は同様にhttp://example.com/su/auth/login
にリダイレクトすることができるはず、「アプリケーション」エリアのため、ユーザの要求http://example.com/app/history/dashboard場合、私は私が望むhttp://example.com/app/auth/loginOWINを使用したエリアベースの認証

にリダイレクトすることができるはずですがカスタム属性を避け、したがって、次のコードを試してみましたが、それは常にrootログインパスにすなわち、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) 
      }); 
     } 
} 

をリダイレクトしているために、私は正しいアプローチを以下のか、同じことを達成するための他の方法はありますかな?ありがとう!

答えて

2

CookieAuthenticationOptions.LoginPath起動時にプロパティが1回設定されます。要求に応じて異なるURLを使用するには、CookieAuthenticationOptions.Providerで設定したICookieAuthenticationProviderのカスタム実装を使用するか、OnApplyRedirectのカスタムアクションを組み込みのCookieAuthenticationProviderで設定します。 2番目のオプションは簡単で、あなたのケースでは十分であるようです。ここで

はサンプルコードです:

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); 
} 
関連する問題