4

我有一個ASP.NET核心站點,它爲大多數頁面使用cookie身份驗證。對於這些頁面,爲未授權客戶端提供302重定向的默認服務器響應是可取的。但是,該網站也接受API請求;他們使用API​​密鑰並且不能使用cookie。禁止在ASP.NET核心中的API URL上重定向

理想情況下,我想完全關閉API URL的Cookie處理,但最低限度,我需要確保如果API客戶端未經授權,服務器不會響應302重定向。

回答

9

將重定向事件處理程序替換爲僅在路徑不是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是不同的。

0

對於.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); 
}; 
+1

我更新了我的答案,包括ASP.NET核心2.我的更新,我沒有取代'事件',而只是設置其相關的屬性。 –