如何将 URL 中的 bearer access_token 传递给 ABP API 的 Get 请求

How to pass bearer access_token in URL for Get request to ABP API

我正在使用 ABP vNext v3.3,在请求 Header.

中传递 Bearer access_code 时调用 Api 没有问题

但是,我想将 access_code 直接放在 URL 中作为 link,然后用户只需单击 link 即可执行相同的操作。 有人知道这是否可能以及如何传递查询字符串吗?我试过了:

https://endpoint?access_code=[我的访问码]

https://endpoint?Authorization=Bearer+[我的访问码]

遗憾的是没有欢乐。 谢谢

在 header

中调用 api 时传递令牌

授权:承载+代码

使用这个link获得令牌

https://localhost:44319/connect/token

enter image description here

根据信息。我从 https://whosebug.com/a/21496536/10350621 获得,下面是我的实现,效果很好。

MyProjectNameHttpApiHostModule.cs 中,添加 JwtBearerEvents 以从 header 或 QueryString:

获取令牌
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
    context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = configuration["AuthServer:Authority"];
            options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
            options.Audience = "MySystemName";
            options.Events = new JwtBearerEvents()
            {                        
                OnMessageReceived = c =>
                {
                    string authorization = c.Request.Headers["Authorization"];

                    if (!string.IsNullOrEmpty(authorization) && authorization.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
                    {
                        c.Token = authorization.Substring("Bearer ".Length).Trim();
                    }
                    // If no authorization header found, then check access_token from QueryString
                    else
                    {
                        var accessToken = c.Request.Query["access_token"];
                        if (!string.IsNullOrEmpty(accessToken))
                        {
                            c.Token = accessToken;
                        }
                    }

                    // If no token found, no further work possible
                    if (!string.IsNullOrEmpty(c.Token))
                    {
                        return Task.CompletedTask;
                    }

                    c.NoResult();
                    return Task.CompletedTask;
                }
            };
        });
    }
}