我有一個ASP.NET核心站點,它爲大多數頁面使用cookie身份驗證。對於這些頁面,爲未授權客戶端提供302重定向的默認服務器響應是可取的。但是,該網站也接受API請求;他們使用API密鑰並且不能使用cookie。禁止在ASP.NET核心中的API URL上重定向
理想情況下,我想完全關閉API URL的Cookie處理,但最低限度,我需要確保如果API客戶端未經授權,服務器不會響應302重定向。
我有一個ASP.NET核心站點,它爲大多數頁面使用cookie身份驗證。對於這些頁面,爲未授權客戶端提供302重定向的默認服務器響應是可取的。但是,該網站也接受API請求;他們使用API密鑰並且不能使用cookie。禁止在ASP.NET核心中的API URL上重定向
理想情況下,我想完全關閉API URL的Cookie處理,但最低限度,我需要確保如果API客戶端未經授權,服務器不會響應302重定向。
將重定向事件處理程序替換爲僅在路徑不是API時才使用默認行爲的處理程序。在地方
static Func<RedirectContext<CookieAuthenticationOptions>, Task> ReplaceRedirector(HttpStatusCode statusCode, Func<RedirectContext<CookieAuthenticationOptions>, Task> existingRedirector) =>
context => {
if (context.Request.Path.StartsWithSegments("/api")) {
context.Response.StatusCode = (int)statusCode;
return Task.CompletedTask;
}
return existingRedirector(context);
};
這樣,API控制器方法可以調用Unauthorized()
和Forbid()
,而不會導致重定向:在Startup.ConfigureServices
,補充一點:
services.ConfigureApplicationCookie(options => {
options.Events.OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, options.Events.OnRedirectToAccessDenied);
options.Events.OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, options.Events.OnRedirectToLogin);
});
使用此輔助方法來代替重定向方法。
更新:以上是針對ASP.NET Core 2的。code for ASP.NET Core 1是不同的。
對於.NET的核心2.X這裏是(根據愛德華的答案)修復:
services.ConfigureApplicationCookie(options =>
{
options.Events = new CookieAuthenticationEvents
{
OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, context => options.Events.RedirectToAccessDenied(context)),
OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, context => options.Events.RedirectToLogin(context))
};
});
其中ReplaceRedirector
:
Func<RedirectContext<CookieAuthenticationOptions>, Task> ReplaceRedirector(HttpStatusCode statusCode, Func<RedirectContext<CookieAuthenticationOptions>, Task> existingRedirector) =>
context =>
{
if (context.Request.Path.StartsWithSegments("/api"))
{
context.Response.StatusCode = (int)statusCode;
return Task.CompletedTask;
}
return existingRedirector(context);
};
我更新了我的答案,包括ASP.NET核心2.我的更新,我沒有取代'事件',而只是設置其相關的屬性。 –