我可以在Authenticate
标头中提供以下JWT作为承载令牌时,针对使用authorization
属性保护的Servicestack端点进行身份验证。
可以通过GetSession().Email
等轻松访问某些属性。
在服务堆栈服务中,如何提取UserId
和AccountId
有效负载值?
{
"iss": "aaaaaaaaaaa.net",
"iat": 1485429344,
"exp": 1516965344,
"aud": "aaaaaaaaaaaaaaaa.net",
"sub": "aaaaaaaaaaaaaaaa@gmail.com",
"given_name ": "aaaaaaaa",
"family_name ": "aaaaaaaa",
"Email": "aaaaaaaaaaaaaaaa@gmail.com",
"Role": [
"Manager",
"Administrator"
],
"UserId": "9df6e69f1a3c4be3a130b517736edb77",
"AccountId": "b55da2067a514d83b6d12cb3852405e1"
}
注意:
我尝试使用AuthUserSession
创建自定义SessionAs<CustomAuthUserSession>.AccountId
,但UserId
和AccountId
属性仍为空。
答案 0 :(得分:1)
默认情况下,ServiceStack的JWT AuthProvider仅在JWT令牌中嵌入最小信息。 JWT文档解释了如何在JWT令牌中嵌入和提取其他元数据:
虽然默认情况下有效信息仅嵌入到有效内容中,但是会在会话中填充嵌入在令牌中的所有匹配的AuthUserSession属性,您可以使用CreatePayloadFilter委托将其添加到有效内容中。因此,如果您还希望在用户注册时有权访问,则可以使用以下命令将其添加到有效负载中:
new JwtAuthProvider(AppSettings)
{
CreatePayloadFilter = (payload,session) =>
payload["CreatedAt"] = session.CreatedAt.ToUnixTime().ToString()
}
您还可以使用过滤器修改可用于更改JWT令牌行为的任何现有属性,例如:我们可以添加一个特殊的异常,将JWT Expiration扩展到Acme Inc的所有用户:
new JwtAuthProvider(AppSettings)
{
CreatePayloadFilter = (payload,session) => {
if (session.Email.EndsWith("@acme.com"))
payload["exp"] = DateTime.UtcNow.AddYears(1).ToUnixTime().ToString();
}
}
同样,您可以使用CreateHeaderFilter委托修改JWT标头,并修改使用PopulateSessionFilter填充用户会话的方式。