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.我的更新,我没有取代'事件',而只是设置其相关的属性。 –