啟用 UseAuthentication 後,讓MVC及API驗證失敗時有不同的行為
專案簡單的用cookie做登入驗證,且MVC跟API都放在同個 project 裡面,並且設定了未登入時的導向頁面
在登入驗證時發現 MVC 跟 API 在驗證失敗時都拿到了回應 302,為了讓API驗證失敗時返回401,MVC則是302到登入頁面,調整下 Startup
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = "/Auth/Login";
options.AccessDeniedPath = "/Auth/Denied";
options.Events.OnRedirectToLogin = context =>
{
if (context.Request.Path.StartsWithSegments("/api"))
{
context.Response.Clear();
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
return Task.CompletedTask;
}
context.Response.Redirect(context.RedirectUri);
return Task.CompletedTask;
};
});
- 設定 OnRedirectToLogin,因為Api 路由指定都會是 /api 開頭,所以直接從這邊判斷為 api 時返回 401 錯誤,其餘MVC的情況則返回原本的302
- 在 .NET Core 多了一個靜態class “Microsoft.AspNetCore.Http.StatusCodes” 可以使用,可以省去以前要用 “System.Net.HttpStatusCode” 再轉成 int 的麻煩
專案簡單的用cookie做登入驗證,且MVC跟API都放在同個 project 裡面,並且設定了未登入時的導向頁面
在登入驗證時發現 MVC 跟 API 在驗證失敗時都拿到了回應 302,為了讓API驗證失敗時返回401,MVC則是302到登入頁面,調整下 Startup
services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie(options => { options.LoginPath = "/Auth/Login"; options.AccessDeniedPath = "/Auth/Denied"; options.Events.OnRedirectToLogin = context => { if (context.Request.Path.StartsWithSegments("/api")) { context.Response.Clear(); context.Response.StatusCode = StatusCodes.Status401Unauthorized; return Task.CompletedTask; } context.Response.Redirect(context.RedirectUri); return Task.CompletedTask; }; });