網站搜尋

typescript - 成功使用 ServiceStack 認證後 RefreshToken 未定義


  • ServiceStack 版本 5.0
  • ServiceStack Typescript 客戶端版本 0.0.40

以下程式碼呼叫了我的身份驗證微服務,並成功驗證了使用者,並返回了其持有者令牌:

var request = new Authenticate();
request.provider = "credentials";
request.userName = userName;
request.password = password;
request.useTokenCookie = true;

this.client.post(request)
.then(res => {
    if (res.bearerToken != null) {
    console.log('auth success', res);
    console.log('auth refresh token', res.refreshToken);
    resolve(true);
    }
    resolve(false);
}, msg => {
    console.log('log in failed');
    reject(msg);
})

問題是我的認證微服務沒有返回刷新令牌:

我對我的身份驗證微服務的配置:

Plugins.Add(new AuthFeature(() => new CustomUserSession(),
    new IAuthProvider[] {
        new JwtAuthProvider
        {
            HashAlgorithm = AuthSettings.HashAlgorithm,
            RequireSecureConnection = requireSecureConnection,
            AuthKeyBase64 = AuthSettings.JwtAuthKeyBase64,
            ExpireTokensIn        = TimeSpan.FromHours(_configuration["AuthSettings:ExpireTokensIn"].ToDouble()),
            ExpireRefreshTokensIn = TimeSpan.FromHours(_configuration["AuthSettings:ExpireRefreshTokensIn"].ToDouble()),
            CreatePayloadFilter = (payload,session) => {
                    payload["zipCode"] = ((CustomUserSession)session).ZipCode;
            },
            PopulateSessionFilter = AuthSettings.PopulateSessionFilterImplementation
        },
        new CustomCredentialsAuthProvider((ITsoContext)_serviceProvider.GetService(typeof(ITsoContext))) //HTML Form post of User/Pass
    }));

答案#1

如果你正在使用自訂的 AuthProvider 覆寫 CredentialsAuthProvider,請確保你也設置了身份驗證已執行於:

authService.Request.Items[Keywords.DidAuthenticate] = true;

對 JWT 刷新令牌的支持也需要一個已註冊的 AuthRepository。

如果你正在使用沒有 IAuthRepository 的自訂 AuthProvider,我剛剛新增了支援,可以實作 IUserSessionSource 作為填充新 JWT 令牌中 Sessions 的替代來源,你可以透過在 IOC 中註冊它或讓你的自訂 AuthProvider 實作來使用這個功能:

public interface IUserSessionSource
{
    IAuthSession GetUserSession(string userAuthId);
}

實作應該只在使用者被允許登入時返回已填充的 IAuthSession,也就是說,如果他們的帳號被停用,應該拋出像這樣的例外:

throw HttpError.Forbidden("User is suspended");

從 ServiceStack v5 開始,支援 IUserSessionSource,現在可在 MyGet 上獲得。在升級之前,請先查看 v5 的變更。