You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ServiceStack JwtAuthProvider中带@的UserAuthName为何未写入JWT令牌

ServiceStack JwtAuthProvider 过滤带@符号UserAuthName的设计原因

这个判断逻辑的设计初衷是对齐OpenID Connect的JWT Claim语义规范,避免不同字段的语义混淆:

  • 按照OpenID Connect的标准定义,preferred_username字段专门用来存储用户的非邮箱类账号标识,比如自定义短用户名、工号、登录名这类面向终端展示的身份标识;邮箱格式的身份标识统一归属于email Claim字段。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:18:25