ServiceStack JwtAuthProvider中带@的UserAuthName为何未写入JWT令牌
ServiceStack JwtAuthProvider 过滤带@符号UserAuthName的设计原因
这个判断逻辑的设计初衷是对齐OpenID Connect的JWT Claim语义规范,避免不同字段的语义混淆:
- 按照OpenID Connect的标准定义,
preferred_username字段专门用来存储用户的非邮箱类账号标识,比如自定义短用户名、工号、登录名这类面向终端展示的身份标识;邮箱格式的身份标识统一归属于emailClaim字段。 - ServiceStack默认认证流程里的
session.UserAuthName是复用字段:用户用邮箱注册/登录时,这个字段存储的是邮箱地址;用户用非邮箱格式的用户名注册/登录时,存储的才是标准意义上的用户名。 - 增加
!Contains("@")的过滤判断,本质是做了一个轻量格式校验,避免把邮箱值错误写入preferred_username字段,保证生成的JWT字段语义和通用第三方系统兼容,减少跨系统对接时的字段冲突。
这个默认逻辑确实没有覆盖「允许用户名包含@但本身不是邮箱」的自定义业务场景,不是刻意拦截这类合法用户名。如果你的系统需要支持带@的用户名写入preferred_username字段,不需要修改底层源码,直接通过扩展自定义逻辑就能实现:
你可以重写JwtAuthProvider的
CreateJwtPayload方法,或者直接配置CreateJwtPayloadFilter委托覆盖默认赋值规则,参考实现:
var jwtProvider = new JwtAuthProvider(appSettings) { CreateJwtPayloadFilter = (session, payload) => { if (string.IsNullOrEmpty(session.UserName) && !string.IsNullOrEmpty(session.UserAuthName)) { payload["preferred_username"] = session.UserAuthName; } } }; // 注册JWT认证提供者即可 Plugins.Add(jwtProvider);
内容的提问来源于stack exchange,提问作者Robin Bouwmeester
相关产品推荐
相关产品推荐

