Servicestack GlobalRequestFilters将其他用户身份验证数据填充到JWT令牌中



我想在用户登录时向响应添加其他属性。

调用 https://Servicestackservice/auth/credentials?userName=****&password=**** 时,我得到以下响应。我想添加 2 个附加值。 日期格式和时区

{ "用户 ID": "21", "会话 ID": "****", "用户名": "系统管理员", "显示名称": "系统管理员", "referrerUrl":空, "持有者令牌": "****", "刷新令牌":*", "配置文件网址": *", "角色": [ 查看 ], "权限": [ 查看 ], "响应状态":{ "错误代码":空, "消息":空, "stackTrace":空, "错误":空, "元":空 }, "元":空 }

我从SS论坛中找到了一个示例。我不得不对其进行一些修改以使其运行。

来自 SS 文档

Modifying the Payload

虽然默认情况下只有有限的信息嵌入到有效负载中,但令牌中嵌入的所有匹配的 AuthUserSession 属性也将填充到会话中,您可以使用 CreatePayloadFilter 委托将其添加到有效负载中。因此,如果您还想访问用户注册的时间,则可以通过以下方式将其添加到有效负载中:

我希望这就是我让他们进入">匹配身份验证用户会话"的方式

this.GlobalRequestFilters.Add(async (req, res, requestDto) =>
{
AuthFilter.AuthResponse(req, res, requestDto);
});
public static void AuthResponse(IRequest req, IResponse res, object response)
{
var authRes = response as Authenticate;
if (authRes == null || authRes.UserName == null)
{
return;
}
var session = (CustomUserSession)req.GetSession();
if (session != null && session.UserAuthId != null)
{
//General Format for US
string dformat = "g";
using (var db = HostContext.TryResolve<IDbConnectionFactory>().Open())
{
var userAuthExt = db.Single<UserAuthExtension>(ext => ext.UserAuthId == int.Parse(session.UserAuthId));
if (userAuthExt != null)
{
dformat = userAuthExt.DateTimeFormat;
}
}
authRes.Meta = new Dictionary<string, string> {{"TimeZone", session.TimeZone}, {"DateFormat", dformat}};
}
}

添加此项以尝试获取 JWT 令牌来保存新数据。检查有效负载,我可以看到 2 个新值已添加到列表中。

new JwtAuthProvider(AppSettings)
{
CreatePayloadFilter = (payload, session) =>
{
if (session != null && session.UserAuthId != null)
{
//General Format for US
string dformat = "g";
using (var db = HostContext.TryResolve<IDbConnectionFactory>().Open())
{
var userAuthExt = db.Single<UserAuthExtension>(ext => ext.UserAuthId == int.Parse(session.UserAuthId));
if (userAuthExt != null)
{
dformat = userAuthExt.DateTimeFormat;
}
}
payload["TimeZone"] = ((AuthUserSession) session).TimeZone;
payload["DateFormat"] = dformat;
}
},

你应该链接到你所指的文档,我相信这是ServiceStack的JWT修改有效载荷文档。虽然不清楚您指的是客户论坛中的哪个示例。

也不清楚问题是什么,我假设是这个陈述:

调用/auth/credentials?用户名=****&password=**** 时,我没有看到新值。

您期望这些值究竟在哪里?如果通过凭据进行身份验证,则不会通过 JWT 进行身份验证,因此不会在用户会话上填充这些附加属性。如果它们嵌入在 JWT 的正文有效负载中,则由于TimeZone是 AuthUserSession 属性,因此如果它包含在 JWT 有效负载中,则应填充它:

case "TimeZone":
authSession.TimeZone = entry.Value;
break;

但是DateFormat不是AuthUserSession属性,因此您需要通过提供PopulateSessionFilter实现来手动填充它,例如:

new JwtAuthProvider(AppSettings) 
{
PopulateSessionFilter = (session,payload,req) => 
session.Meta["DateFormat"] = payload["DateFormat"];
}

但是,这些属性仅在通过 JWT 进行身份验证时才会填充在用户会话中。

为了帮助诊断任何问题,您应该在CreatePayloadFilter中提供一个断点,以查看您填充了 JWT 有效负载的内容,并在PopulateSessionFilter中放置一个断点,以检查有效负载中包含的内容以及生成的填充会话。

最新更新