使用 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);
}
我正在开发 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);
}