使用OWIN进行基于区域的认证

时间:2017-01-11 18:43:37

标签: asp.net-mvc asp.net-mvc-5 owin owin-middleware

我正在开发一个MVC5 Web应用程序。该应用程序有2个区域,'SU'和''App'。每个区域都应独立进行身份验证。每个区域也有自己的登录页面 我正在使用OWIN来验证用户身份 现在的问题是,我无法根据用户请求的区域设置owin CookieAuthenticationOptions LoginPath
例如,如果用户请求http://example.com/su/reports/dashboard,我应该可以将其重定向到http://example.com/su/auth/login 同样,对于“应用”区域,如果用户请求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)
            });
        }
}  

我是否遵循正确的方法或是否有其他方法来实现相同的目标?谢谢!

1 个答案:

答案 0 :(得分:2)

var aArray = [ { title: 'Abc', price: '1,200' }, { title: 'def', price: '900' } ] var bArray = [ { title: 'def', price: '900' }, { title: 'Abc', price: '1,200' } ] var sameTitle = true; aArray.forEach(function(objA){ var titleMatch = bArray.find(function(objB){ return objA.title === objB.title; }) if(titleMatch === undefined) sameTitle = false; }) console.log(sameTitle); 属性在启动时设置一次。要根据请求使用不同的网址,您可以使用通过CookieAuthenticationOptions.LoginPath设置的ICookieAuthenticationProvider自定义实施,也可以在内置CookieAuthenticationOptions.Provider中设置OnApplyRedirect的自定义操作。第二种选择更简单,对你的情况来说似乎已经足够了。

以下是示例代码:

CookieAuthenticationProvider