我需要我的应用程序支持针对我们的私人数据库的自定义身份验证,并遵循Adrian Hall上的建议书https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/custom/我对用户进行身份验证没有问题。当我需要刷新访问令牌时出现问题。 由于我被迫使用自定义身份验证,我有以下问题:
1)我应该调用MobileServicesClient.RefreshUserAsync(),如果是,我应该在服务器上实现什么样的端点?它会不会每次重新发出另一个令牌,使旧的无效?什么时候应该进行刷新调用?
2)我读过关于使用永不过期的刷新令牌,但我无法真正找到示例实现,或者如何在自定义身份验证方案中实现它的说明,有人可能指向正确的方向?
非常感谢提前
答案 0 :(得分:5)
我应该调用MobileServicesClient.RefreshUserAsync(),如果是,我应该在服务器上实现什么样的端点?它会不会每次重新发出另一个令牌,使旧的无效?什么时候应该进行刷新调用?
我已经检查了来自RefreshUserAsync
的方法Microsoft.WindowsAzure.Mobile.dll
,该方法将针对/.auth/refresh
端点发送get请求,以便使用您登录用户的提供程序刷新访问令牌。由于您使用的是自定义身份验证,因此无法使用此方法刷新authenticationToken
。
我已经阅读了有关使用永不过期的刷新令牌的信息,但我无法真正找到示例实现,或者有关如何在自定义身份验证方案中实现它的说明,有人可能会指向我正确的方向?
使用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
。< / p>
<强> RESULT 强>