Azure MobileApp 自定义身份验证、刷新令牌
Azure MobileApp custom authentication, refresh token
我需要我的应用程序支持针对我们的私有数据库的自定义身份验证,并遵循此处的 Adrian Hall 书中的建议 https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/custom/ 我对用户进行身份验证没有问题。当我需要刷新访问令牌时,问题就来了。
由于我被迫使用自定义身份验证,因此我有以下问题:
1) 我应该调用 MobileServicesClient.RefreshUserAsync() 吗?如果是,我应该在服务器上实现什么样的端点?它会不会每次都重新发行另一个令牌,使旧令牌失效?应该何时进行刷新调用?
2) 我读过有关使用永不过期刷新令牌的信息,但我真的找不到示例实现或有关如何在自定义身份验证场景中实现它的说明,有人可以指点我方向对吗?
非常感谢
Should I call MobileServicesClient.RefreshUserAsync(), and if so, what kind of endpoint should I implement on the server? Will it reissue another token every time, invalidating the old? When should be the refresh call be made?
我已经检查了 Microsoft.WindowsAzure.Mobile.dll
中的方法 RefreshUserAsync
,它会向 /.auth/refresh
端点发送一个获取请求,以便为您的登录用户刷新访问令牌。由于您使用的是自定义身份验证,因此无法使用此方法刷新 authenticationToken
.
I've read about using a never-expiring refresh token, but I can't really find a sample implementation, or instructions on how to implement it in a custom auth scenario, could someone point me to the right direction?
当使用 AppServiceLoginHandler 中的 CreateToken
方法时,您可以将 lifetime
指定为 null
,然后您将检索一个永不过期的 authenticationToken
如下:
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(claims, signingKey, audience, issuer,null);
此外,您可以尝试构建端点以基于旧的有效令牌创建新令牌,如下所示:
[Route(".auth/login/customRefreshToken")]
public IHttpActionResult RefreshToken([FromBody] RefreshTokenInput body)
{
string tokenString = body.AuthenticationToken;
try
{
var jwtSecurityToken = new JwtSecurityToken(tokenString);
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(jwtSecurityToken.Claims, signingKey, audience, issuer, TimeSpan.FromDays(30));
return Ok(new LoginResult()
{
AuthenticationToken = token.RawData
});
}
catch (Exception e)
{
return BadRequest("$Error = {e.Message}, StackTrace = {e.StackTrace}");
}
}
注意: 对于您的移动客户端,您可以使用 MobileServiceClient.InvokeApiAsync
检索新令牌,然后解析 authenticationToken
并将其更新为 MobileServiceClient.CurrentUser.MobileServiceAuthenticationToken
.
结果
我需要我的应用程序支持针对我们的私有数据库的自定义身份验证,并遵循此处的 Adrian Hall 书中的建议 https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/custom/ 我对用户进行身份验证没有问题。当我需要刷新访问令牌时,问题就来了。 由于我被迫使用自定义身份验证,因此我有以下问题:
1) 我应该调用 MobileServicesClient.RefreshUserAsync() 吗?如果是,我应该在服务器上实现什么样的端点?它会不会每次都重新发行另一个令牌,使旧令牌失效?应该何时进行刷新调用?
2) 我读过有关使用永不过期刷新令牌的信息,但我真的找不到示例实现或有关如何在自定义身份验证场景中实现它的说明,有人可以指点我方向对吗?
非常感谢
Should I call MobileServicesClient.RefreshUserAsync(), and if so, what kind of endpoint should I implement on the server? Will it reissue another token every time, invalidating the old? When should be the refresh call be made?
我已经检查了 Microsoft.WindowsAzure.Mobile.dll
中的方法 RefreshUserAsync
,它会向 /.auth/refresh
端点发送一个获取请求,以便为您的登录用户刷新访问令牌。由于您使用的是自定义身份验证,因此无法使用此方法刷新 authenticationToken
.
I've read about using a never-expiring refresh token, but I can't really find a sample implementation, or instructions on how to implement it in a custom auth scenario, could someone point me to the right direction?
当使用 AppServiceLoginHandler 中的 CreateToken
方法时,您可以将 lifetime
指定为 null
,然后您将检索一个永不过期的 authenticationToken
如下:
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(claims, signingKey, audience, issuer,null);
此外,您可以尝试构建端点以基于旧的有效令牌创建新令牌,如下所示:
[Route(".auth/login/customRefreshToken")]
public IHttpActionResult RefreshToken([FromBody] RefreshTokenInput body)
{
string tokenString = body.AuthenticationToken;
try
{
var jwtSecurityToken = new JwtSecurityToken(tokenString);
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(jwtSecurityToken.Claims, signingKey, audience, issuer, TimeSpan.FromDays(30));
return Ok(new LoginResult()
{
AuthenticationToken = token.RawData
});
}
catch (Exception e)
{
return BadRequest("$Error = {e.Message}, StackTrace = {e.StackTrace}");
}
}
注意: 对于您的移动客户端,您可以使用 MobileServiceClient.InvokeApiAsync
检索新令牌,然后解析 authenticationToken
并将其更新为 MobileServiceClient.CurrentUser.MobileServiceAuthenticationToken
.
结果