使用 OWIN 进行基于区域的身份验证

Area based authentication using OWIN

我正在开发 MVC5 网络应用程序。此应用程序有 2 个区域,'SU' 和''App'。每个区域都应独立验证。每个区域也有自己的登录页面。
我正在使用 OWIN 来验证用户。
现在的问题是,我无法根据用户请求的区域设置owin CookieAuthenticationOptions LoginPath
例如,如果用户请求 http://example.com/su/reports/dashboard,我应该能够将他们重定向到 http://example.com/su/auth/login
同样,对于 'App' 区域,如果用户请求 http://example.com/app/history/dashboard,我应该能够将他们重定向到 http://example.com/app/auth/login

我想避免自定义属性,因此尝试了以下代码,但它总是重定向到根登录路径,即 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)
            });
        }
}  

我遵循的方法是否正确,或者是否有其他方法可以达到同样的目的?谢谢!

CookieAuthenticationOptions.LoginPath 属性 在启动时设置一次。为了根据请求使用不同的 URL,您可以使用通过 CookieAuthenticationOptions.Provider 设置的 ICookieAuthenticationProvider 的自定义实现,或者只在内置 OnApplyRedirect 中设置自定义操作 CookieAuthenticationProvider。第二种选择更简单,似乎足以满足您的情况。

这是一个示例代码:

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);
}