.net core IdentityServer4 使用query参数
基本用法请参考官方文档:https://identityserver4.readthedocs.io/en/latest/index.html
这里不对具体用法进行说明,一般情况下,Startup添加验证,就可以了,代码如下
services.AddAuthorization(); services.AddAuthentication("Bearer") .AddIdentityServerAuthentication(options => { options.Authority = "这里写验证服务器链接"; options.RequireHttpsMetadata = false; options.ApiName = "test"; });
这里默认的验证token是取的header里面的Authorization参数
以下讨论的目的是:需要既可以从query里面获取token,也可以从header里面获取token
1. IdentityServerAuthentication
修改TokenRetriever来达到我们的要求
services.AddAuthorization(); services.AddAuthentication("Bearer") .AddIdentityServerAuthentication(options => { options.Authority = Configuration["CQMSERVICE_AUTHENDPOINT"]; options.RequireHttpsMetadata = false; options.ApiName = "vte-api"; options.TokenRetriever = request => { var authorization = TokenRetrieval.FromAuthorizationHeader()(request); if (string.IsNullOrEmpty(authorization)) { authorization = TokenRetrieval.FromQueryString("token")(request); if (!string.IsNullOrEmpty(authorization)) { authorization = authorization.Replace("Bearer ", ""); } } return authorization; }; });
TokenRetriever 的默认值是TokenRetrieval.FromAuthorizationHeader(),当然如果你只需要通过query参数验证的话,可以直接赋值为TokenRetrieval.FromQueryString("token")
/// <summary> /// Callback to retrieve token from incoming request /// </summary> public Func<HttpRequest, string> TokenRetriever { get; set; } = TokenRetrieval.FromAuthorizationHeader();
2.JwtBearer
如果是JWT验证的话,就没TokenRetrieval这个属性设置了,但是可以通过设置OnMessageReceived事件来达到目的
官方源代码如下
jwtOptions.Events = new JwtBearerEvents { OnMessageReceived = e => { e.Token = InternalTokenRetriever(e.Request); return JwtBearerEvents.MessageReceived(e); }, OnTokenValidated = e => JwtBearerEvents.TokenValidated(e), OnAuthenticationFailed = e => JwtBearerEvents.AuthenticationFailed(e), OnChallenge = e => JwtBearerEvents.Challenge(e) };
所以可以这么定义一下事件
services.AddAuthorization(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateLifetime = true,//是否验证失效时间 ValidateIssuerSigningKey = true,//是否验证SECURITYKEY IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("ABCDEFG"))//SECURITYKEY }; options.Events = new JwtBearerEvents { OnMessageReceived = context => { context.Token = context.Request.Query["token"]; return Task.CompletedTask; } }; });
以上我个人测试是没什么问题的,如果有其他问题,欢迎留言。
分类:
.net core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?