【问题标题】:ServiceStack v6 JWTAuthProvider doesn't return bearer and resfresh tokensServiceStack v6 JWTAuthProvider 不返回不记名和 resfresh 令牌
【发布时间】:2022-02-17 17:12:32
【问题描述】:

我从 ServiceStack web 下载了 .NET6 项目模板,摆弄了一下并使用 CredentialAuthProvider 成功设置了身份验证。但是,当添加 JwtAuthProvider 时,它不会返回预期的令牌(承载和刷新) ~ 在 PostMan 和 ServiceStack API Explorer 中都进行了测试。它总是返回与 CredentialAuthProvider 的响应相同的响应,如下所示:

{
    "userId": "1",
    "sessionId": "MLheS29QdaaynocpNYLN",
    "userName": "admin@email.com",
    "displayName": "Admin User",
    "profileUrl": "...",
    "roles": ["Admin"],
    "permissions": []
}

这是我的 AuthFeature 设置

var privateKey = RsaUtils.CreatePrivateKeyParams(RsaKeyLengths.Bit2048);
appHost.Plugins.Add(new AuthFeature(() => new CustomUserSession(),
    new IAuthProvider[] {
        new JwtAuthProvider(appSettings)
        {
            HashAlgorithm = "RS256",
            PrivateKeyXml = privateKey.ToPrivateKeyXml(),
            RequireSecureConnection = false,
            SetBearerTokenOnAuthenticateResponse = true, 
        },
        new CredentialsAuthProvider(appSettings),     /* Sign In with Username / Password credentials */
}));

为了测试令牌的数量,我使用下面的 DummyAuthProvider 并将其添加到 IAuthProvider 数组中:

public class DummyAuthProvider : AuthProvider, IAuthResponseFilter
{
    public DummyAuthProvider() => Provider = "dummy";

    public Task ExecuteAsync(AuthFilterContext authContext)
    {
        //throw new NotImplementedException();
        var jwt = (JwtAuthProvider)AuthenticateService.GetJwtAuthProvider();

        var session = authContext.Session;
        var authService = authContext.AuthService;
        
        var shouldReturnTokens = authContext.DidAuthenticate;
        if (shouldReturnTokens && jwt.SetBearerTokenOnAuthenticateResponse && session.IsAuthenticated)
        {
            if (!jwt.RequireSecureConnection || authService.Request.IsSecureConnection)
            {
                //... will populate jwt tokens
            }
        }
       
        //.. wont populate jwt tokens
    
        return Task.CompletedTask;
    }
}

结果是它实际上填充了 jwt 令牌。但是 API 响应不包括填充的令牌

非常感谢您对此的任何见解。

【问题讨论】:

    标签: authentication jwt servicestack


    【解决方案1】:

    请阅读JWT Changes in latest ServiceStack v6 Release,默认情况下,JWT 在 HttpOnly Secure ss-tok Cookie 中返回。

    您可以通过以下方式恢复 JWT 在响应正文中返回承载/刷新令牌:

    new JwtAuthProvider(AppSettings) {
        UseTokenCookie = false
    },
    

    但是我建议使用默认 cookie,因为它能够提供改进的透明 JWT 令牌处理,经过身份验证的客户端会自动为每个请求重新发送 JWT 令牌 cookie。由于它的工作方式与普通会话 Cookie 类似,它可以让您的服务器切换到使用无状态 JWT Cookie,而无需更新现有的客户端身份验证。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多