禁止重定向ASP.NET Core中的API URL

问题描述 投票:12回答:2

我有一个ASP.NET Core站点,它对大多数页面使用cookie身份验证。对于这些页面,需要为未授权客户端提供302重定向的默认服务器响应。但是,该站点也接受API请求;他们使用API​​密钥,不使用cookie。

理想情况下,我想完全关闭API URL的cookie处理,但最低限度,我需要确保如果API客户端未经授权,服务器不会响应302重定向。

authentication cookies asp.net-core asp.net-identity-2 http-redirect
2个回答
20
投票

仅当路径不是API时,才将重定向事件处理程序替换为使用默认行为的处理程序。在Startup.ConfigureServices中,添加以下内容:

services.ConfigureApplicationCookie(options => {
    options.Events.OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, options.Events.OnRedirectToAccessDenied);
    options.Events.OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, options.Events.OnRedirectToLogin);
});

使用此帮助器方法替换重定向方法:

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()而不会导致重定向。

更新:以上是针对ASP.NET Core 2. code for ASP.NET Core 1是不同的。


0
投票

对于.net core 2.x,这是一个修复程序(根据Edward的回答):

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);
};
© www.soinside.com 2019 - 2024. All rights reserved.