javascript - 返回响应头 OnAuthenticationFailed

标签 javascript c# api asp.net-core http-headers

如果用户发送的 token 已过期,我将尝试返回更改后的 header ,以便我可以在过期时重新发送我的刷新 token 。

我将 .NET Core 2.2 与重要的“进程中”托管柜一起使用。

这是我的 Startup.cs 中的 ConfigureServices 方法。

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = "bearer";
    options.DefaultChallengeScheme = "bearer";
}).AddJwtBearer("bearer", options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateAudience = false,
        ValidateIssuer = false,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Configuration["serverSigningPassword"])),
        ValidateLifetime = true,
        ClockSkew = System.TimeSpan.Zero //the default for this setting is 5 minutes
    };
    options.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents
    {
        OnAuthenticationFailed = context =>
        {
            if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
            {
                context.Response.Headers.Add("Token-Expired", "true");
            }
            return System.Threading.Tasks.Task.CompletedTask;
        }
    };
});

然后当我尝试使用以下代码从 javascript 获取“授权”端点时。

async function fetchWithCredentials(url, options) {    
    options.headers['Authorization'] = 'Bearer ' + jwtToken;
    var response = await fetch(url, options);
    if (response.ok) { //all is good, return the response
        return response;
    }

    console.log(response.headers) //nothing in this array

    // it will never do this "if" statement because there are no headers
    if (response.status === 401 && response.headers.has('Token-Expired')) {
        // refresh the token
        return await fetchWithCredentials(url, options); //repeat the original request
    } else { //status is not 401 and/or there's no Token-Expired header
        return response; 
    }
}

这张图片来自悬停在标题上。它确实达到了我的断点(对于 context.Response.Headers.Add() 并且我可以看到计数 = 1(这是我检查时的“ token 过期”)。

enter image description here

最后,这是请求失败后 Postman 的屏幕截图,因此正在发送响应,但我的 JS 未收到响应。 enter image description here

关于为什么我的 header 没有坚持我在 javascript 中的响应有什么想法吗?

最佳答案

当您使用基于 CORS 的 Fetch API 时,访问响应 header 存在限制。由于此限制,您只能访问以下标准 header :

  • 缓存控制
  • 内容语言
  • 内容类型
  • 过期
  • 最后修改时间
  • 编译指示

引用:https://stackoverflow.com/a/44816592/5751404

因此,在客户端访问自定义 header 的一种方法是将 header access-control-expose-headers 添加到响应中, header 以逗号分隔:

services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
    builder.AllowAnyOrigin()
          .AllowAnyMethod()
          .AllowAnyHeader()
          .WithExposedHeaders("Token-Expired"); ;
}));

配置中:

app.UseCors("MyPolicy");

这样您就可以使用 Fetch API over CORS 从客户端访问自定义 header 。

关于javascript - 返回响应头 OnAuthenticationFailed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55909028/

相关文章:

javascript - 幻灯片图像的视差效果

Javascript:在 x 为 object.style.left 时更改 x 的值;

c# - 在 c# rabbitmq 客户端中得到 "Pipelining of requests forbidden"

python - 使用 dropbox API 下载指定文件夹中的所有图像,而不是子文件夹

ios - Swift 3 - 使用 API 调用的最新方法

javascript - 如果我有一串 HTML 代码,如何使用 JQuery 来解析它?

javascript - for 循环中第一行的特殊列布局

c# - Entity Framework 简单名称会导致某些项目出现问题,但不会导致其他项目出现问题

c# - 从 DataRow 内部的 DateTime 对象中提取数据?

sql - 寻找包装在用户定义的 SQL 函数中的外部 SQL 存储过程中的任何 OS/400 API 的工作示例