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 的變更。
