如何使用servicestack

时间:2017-01-26 12:39:07

标签: c# servicestack jwt

我可以在Authenticate标头中提供以下JWT作为承载令牌时,针对使用authorization属性保护的Servicestack端点进行身份验证。

可以通过GetSession().Email等轻松访问某些属性。

在服务堆栈服务中,如何提取UserIdAccountId有效负载值?

{
  "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,但UserIdAccountId属性仍为空。

1 个答案:

答案 0 :(得分:1)

默认情况下,ServiceStack的JWT AuthProvider仅在JWT令牌中嵌入最小信息。 JWT文档解释了如何在JWT令牌中嵌入和提取其他元数据:

Modifying the JWT Payload

虽然默认情况下有效信息仅嵌入到有效内容中,但是会在会话中填充嵌入在令牌中的所有匹配的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填充用户会话的方式。