【问题标题】:How to extract custom JWT properties using servicestack如何使用 servicestack 提取自定义 JWT 属性
【发布时间】:2017-01-26 22:50:14
【问题描述】:

当在 authorization 标头中提供以下 JWT 作为不记名令牌时,我可以成功地针对使用 Authenticate 属性保护的 servicestack 端点进行身份验证。

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

在 servicestack 服务中,我将如何提取 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 属性仍然为空。

【问题讨论】:

    标签: c# servicestack jwt


    【解决方案1】:

    ServiceStack 的JWT AuthProvider 默认只在 JWT Token 中嵌入最少的信息。 JWT 文档解释了如何在 JWT 令牌中嵌入和提取额外的元数据:

    Modifying the JWT Payload

    虽然默认情况下只有有限的信息嵌入到有效负载中,但嵌入在令牌中的所有匹配 AuthUserSession 属性也将填充到 Session 上,您可以使用 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 修改用户会话的填充方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 2019-05-13
      • 2023-04-09
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多