[ASP.NET Core] 啟用 UseAuthentication 後,讓MVC及API驗證失敗時有不同的行為

啟用 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 的麻煩