1

当 ASP.NET Core 身份验证方案重定向到登录页面时,它会将绝对 URL 发送到浏览器。

有可能使这个网址相对吗?

4

2 回答 2

2

RFC2616之前定义了Location重定向中使用的标头,指定 URI 必须是绝对的。这已在 2014 年被RFC7231取代,允许在标头中使用相对路径Location。但是,由于中间经过了 15 年左右,仍会发送绝对位置以保持兼容性。诚然,现在我们已经快到 2020 年了,我想此时大多数客户端实际上会支持相对位置,但至少目前,ASP.NET Core 仍然发送绝对位置。

于 2019-07-03T13:29:58.733 回答
2

您可以处理该OnRedirectToLogin事件以为重定向过程提供您自己的逻辑。这是一个示例实现:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(o =>
    {
        o.Events = new CookieAuthenticationEvents
        {
            OnRedirectToLogin = ctx =>
            {
               var relativeRedirectUri = new Uri(ctx.RedirectUri).PathAndQuery;

               context.Response.Headers["Location"] = relativeRedirectUri;
               context.Response.StatusCode = 401;

               return Task.CompletedTask;
           }
       };
   });

传入的ctx.RedirectUri属性是绝对的,所以上面的代码会创建一个相对副本并使用它。

这个替换的默认实现有点复杂,因为它支持返回 401 的 AJAX 请求和执行重定向的非 AJAX 请求。如果您需要同时支持两者,请查看源代码并进行相应修改。

于 2019-07-03T14:32:35.270 回答