gpt4 book ai didi

c# - 首次操作调用未调用 JwtBearerEvents.OnMessageReceived

转载 作者:行者123 更新时间:2023-12-03 17:07:21 27 4
gpt4 key购买 nike

我使用 WSO2 作为我的身份提供者 (IDP)。它将 JWT 放在名为“X-JWT-Assertion”的 header 中。

为了将它输入 ASP.NET Core 系统,我添加了一个 OnMessageReceived事件。这允许我设置 token到标题中提供的值。

这是我必须这样做的代码(关键部分是最后 3 行非括号代码):

services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddJwtBearer(async options =>
{
options.TokenValidationParameters =
await wso2Actions.JwtOperations.GetTokenValidationParameters();

options.Events = new JwtBearerEvents()
{
// WSO2 sends the JWT in a different field than what is expected.
// This allows us to feed it in.
OnMessageReceived = context =>
{
context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
return Task.CompletedTask;
}
}
};

这一切都完美运行除了服务启动后的第一次调用。需要明确的是,除了第一个电话外,每个电话都完全按照我的意愿工作。 (它将 token 放入并更新 User 对象,就像我需要的那样。)

但是对于第一个电话, OnMessageReceived没有被击中。和 User我的 Controller 中的对象未设置。

我查了 HttpContext对于第一次调用,“X-JWT-Assertion” header 位于 Request.Headers列表(其中包含 JWT)。但是,出于某种原因, OnMessageReceived不需要事件。

我怎样才能得到 OnMessageReceived首次调用我的服务的服务操作?

重要提示:我发现问题是 async awaitAddJwtBearer . (请参阅下面的答案。)这就是我真正想要的这个问题。

但是,由于无法取消赏金,我仍然会将赏金奖励给任何可以展示使用方法的人 AddJwtBearerasync await它正在等待实际的 HttpClient称呼。或显示原因的文档 async await不应该与 AddJwtBearer 一起使用.

最佳答案

更新:
lambda 是 Action方法。它不返回任何东西。因此,如果不火而忘记,就不可能在其中进行异步。

此外,在第一次调用时调用此方法。所以答案是提前在这个方法中调用你需要的任何东西并缓存它。 (但是,我还没有想出一种非 hack 方法来使用依赖注入(inject)项来进行此调用。)然后在第一次调用期间,将调用此 lambda。那时你应该从缓存中提取你需要的值(这样就不会减慢第一次调用的速度)。

这是我最终想通的。
AddJwtBearer 的 lambda不适用于 async await .我的电话 await wso2Actions.JwtOperations.GetTokenValidationParameters();等待就好了,但调用管道无需等待 AddJwtBearer 即可继续运行完成。

async await调用顺序如下:

  • 服务启动(您等待一段时间让一切顺利。)
  • 调用该服务。
  • AddJwtBearer叫做。
  • await wso2Actions.JwtOperations.GetTokenValidationParameters();叫做。
  • GetTokenValidationParameters()调用 HttpClientawait .
  • HttpClient进行等待调用以获取发行者的公共(public)签名 key 。
  • HttpClient正在等待,原始调用的其余部分将通过。尚未设置任何事件,因此它只是像往常一样继续调用管道。
  • 这是它“似乎跳过”OnMessageReceived 的地方。事件。
  • HttpClient使用公钥获取响应。
  • 执行AddJwtBearer继续。
  • OnMessageReceived事件已设置。
  • 第二次调用服务
  • 因为事件最终被设置,所以事件被调用。 (AddJwtBearer 仅在第一次调用时调用。)

  • 因此,当等待发生时(在这种情况下,它最终会触发 HttpClient 调用以获取颁发者签名 key ),第一次调用的其余部分将通过。因为还没有事件设置,所以它不知道调用处理程序。

    我更改了 AddJwtBearer 的 lambda不要异步,它工作得很好。

    笔记:
    这里有两件事看起来很奇怪:
  • 我会认为 AddJwtBearer将在启动时调用,而不是在第一次调用服务时调用。
  • 我会认为 AddJwtBearer不支持 async如果无法正确应用等待,则 lambda 签名。

  • 我不确定这是否是一个错误,但我将其发布为一个以防万一: https://github.com/dotnet/aspnetcore/issues/20799

    关于c# - 首次操作调用未调用 JwtBearerEvents.OnMessageReceived,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61145702/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com