Пользовательская проверка подлинности Azure MobileApp, обновление токена

Мне нужно, чтобы мое приложение поддерживало пользовательскую аутентификацию на основе нашей частной базы данных и следовал советам по книге Адриана Холла здесь https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/custom/ У меня нет проблем с аутентификацией моих пользователей. Проблема возникает, когда мне нужно обновить токен доступа. Поскольку я вынужден остаться с пользовательской аутентификацией, у меня есть следующие вопросы:

1) Должен ли я вызывать MobileServicesClient.RefreshUserAsync(), и если да, то какую конечную точку я должен реализовать на сервере? Будет ли он каждый раз выдавать новый токен, аннулируя старый? Когда должен быть сделан вызов на обновление?

2) Я читал об использовании бесконечного токена обновления, но я не могу найти пример реализации или инструкции о том, как реализовать его в пользовательском сценарии аутентификации, может кто-нибудь указать мне правильное направление?

Спасибо заранее

1 ответ

Решение

Должен ли я вызывать MobileServicesClient.RefreshUserAsync(), и если да, то какую конечную точку я должен реализовать на сервере? Будет ли он каждый раз выдавать новый токен, аннулируя старый? Когда должен быть сделан вызов на обновление?

Я проверил метод RefreshUserAsync от Microsoft.WindowsAzure.Mobile.dll который отправит запрос на получение против /.auth/refresh конечная точка для обновления токена доступа у провайдера для вашего вошедшего в систему пользователя. Поскольку вы используете пользовательскую аутентификацию, вы не можете использовать этот метод для обновления authenticationToken,

Я читал об использовании бесконечного токена обновления, но я не могу найти пример реализации или инструкции о том, как реализовать его в пользовательском сценарии аутентификации, может кто-то указать мне правильное направление?

При использовании CreateToken метод из AppServiceLoginHandler, вы можете указать 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,

РЕЗУЛЬТАТ

Другие вопросы по тегам