servicestack,Asp.net Core Mvc,servicestack" /> servicestack,Asp.net Core Mvc,servicestack" />

Asp.net core mvc Servicestack GlobalRequestFilters将其他用户身份验证数据填充到Jwt令牌中

Asp.net core mvc Servicestack GlobalRequestFilters将其他用户身份验证数据填充到Jwt令牌中,asp.net-core-mvc,servicestack,Asp.net Core Mvc,servicestack,我想在用户登录时向响应添加其他属性 调用****&password=****时,我得到以下响应。我想添加2个附加值。日期格式和时区 { “用户ID”:“21”, “会话ID”:“*****”, “用户名”:“系统管理员”, “显示名称”:“系统管理员”, “refererURL”:空, “BealerToken”:“**”, “刷新令牌”:*“, “profileUrl”:*“, “角色”:[查看 ], “权限”:[查看 ], “反应状态”:{ “错误代码”:空, “消息”:空, “stackT

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

调用****&password=****时,我得到以下响应。我想添加2个附加值。日期格式和时区

{ “用户ID”:“21”, “会话ID”:“*****”, “用户名”:“系统管理员”, “显示名称”:“系统管理员”, “refererURL”:空, “BealerToken”:“**”, “刷新令牌”:*“, “profileUrl”:*“, “角色”:[查看 ], “权限”:[查看 ], “反应状态”:{ “错误代码”:空, “消息”:空, “stackTrace”:空, “错误”:空, “meta”:空 }, “meta”:空 }

我不得不对它进行一些修改以使其运行

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

我希望这就是我如何让他们进入“匹配的AuthUserSession

this.GlobalRequestFilters.Add(异步(req,res,requestDto)=>
{
AuthFilter.AuthResponse(req、res、requestDto);
});
公共静态void AuthResponse(IRequest请求、IResponse响应、对象响应)
{
var authRes=作为身份验证的响应;
if(authRes==null | | authRes.UserName==null)
{
返回;
}
var session=(CustomUserSession)req.GetSession();
if(session!=null&&session.UserAuthId!=null)
{
//我们的通用格式
字符串dformat=“g”;
使用(var db=HostContext.TryResolve().Open())
{
var userAuthExt=db.Single(ext=>ext.UserAuthId==int.Parse(session.UserAuthId));
if(userauthText!=null)
{
dformat=UserAuthText.DateTimeFormat;
}
}
authRes.Meta=newdictionary{{“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;
                            }
                        },
新建JwtAuthProvider(AppSettings)
{
CreatePayloadFilter=(有效负载,会话)=>
{
if(session!=null&&session.UserAuthId!=null)
{
//我们的通用格式
字符串dformat=“g”;
使用(var db=HostContext.TryResolve().Open())
{
var userAuthExt=db.Single(ext=>ext.UserAuthId==int.Parse(session.UserAuthId));
if(userauthText!=null)
{
dformat=UserAuthText.DateTimeFormat;
}
}
有效负载[“时区”]=((AuthUserSession)会话)。时区;
有效载荷[“DateFormat”]=数据格式;
}
},

您应该链接到您所指的文档,我认为这是ServiceStack的JWT文档。尽管不清楚您所指的示例是什么

也不清楚问题是什么,我假设是这样的说法:

调用/auth/credentials?userName=***和password=****时,我看不到新值

您希望这些值的确切位置是什么?如果您通过凭据进行身份验证,那么您不会通过JWT进行身份验证,因此您的用户会话中将不会填充这些附加属性。如果这些属性嵌入JWT的正文负载中,则as
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
中设置一个断点,以检查有效负载中包含的内容以及生成的填充会话。

更新了我的问题。调用****&passwo时rd=****我想添加2个附加值。DateFormat&TimeZone。似乎这不是添加到登录响应中的正确方法。@SteveColeman仍然不清楚这与JWT有什么关系?当您通过凭据进行身份验证时,您使用的是
CredentialAuthProvider
,它返回固定的DTO。您可以填充它的
Meta
字典带有或带有自定义AuthProvider.Doh,现在就可以了。this.GlobalRequestFilters.Add应该是this.GlobalResponseFilters.Add,然后上述代码就可以正常工作了。
case "TimeZone":
    authSession.TimeZone = entry.Value;
    break;
new JwtAuthProvider(AppSettings) 
{
    PopulateSessionFilter = (session,payload,req) => 
        session.Meta["DateFormat"] = payload["DateFormat"];
}