Azure Logout Async

Я пытаюсь принудительно выйти из системы на лазурном сервере. Если вы щелкнете для выхода из системы, а затем нажмите "Войти", у вас не будет запрошено имя пользователя / пароль, просто вы снова войдете в систему.

Я пишу приложение UWP, которое подключается к веб-серверу Azure. Если это уместно, вы можете увидеть, что при выходе из системы он удаляет ссылку из диспетчера учетных данных Windows и восстанавливает ее, как только вы нажимаете кнопку "Вход".

По сути, у меня есть вопросы: что еще мне нужно удалить, чтобы приложение не получало предыдущие учетные данные вместо запроса, чтобы новый пользователь мог войти в систему?

    public async Task LogoutAsync()
    {
        if (Client.CurrentUser == null || Client.CurrentUser.MobileServiceAuthenticationToken == null)
            return;


        // Invalidate the token on the mobile backend
        var authUri = new Uri($"{Client.MobileAppUri}/.auth/logout");
        using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Add("X-ZUMO-AUTH", Client.CurrentUser.MobileServiceAuthenticationToken);
            await httpClient.GetAsync(authUri);
        }


        // Remove the token from the cache
        _loginProvider.RemoveTokenFromSecureStore();

        // Remove the token from the MobileServiceClient
        await Client.LogoutAsync();
    }

    public async Task<MobileServiceUser> LoginAsync()
    {

        Client.CurrentUser = _loginProvider.RetrieveTokenFromSecureStore();

        if (Client.CurrentUser != null && !IsTokenExpired(Client.CurrentUser.MobileServiceAuthenticationToken))
        {
            // User has previously been authenticated, return current authenticated user
            return Client.CurrentUser;
        }

        if (Client.CurrentUser != null && IsTokenExpired(Client.CurrentUser.MobileServiceAuthenticationToken))
        {
            // Token is expired so perform a Logout
            await LogoutAsync();
        }

        // We need to ask for credentials at this point
        await _loginProvider.LoginAsync(Client).ConfigureAwait(false);
        if (Client.CurrentUser != null)
        {
            // We were able to successfully log in, store token for authenticated user
            _loginProvider.StoreTokenInSecureStore(Client.CurrentUser);
        }
        return Client.CurrentUser;
    }

Я должен добавить, что код (я не писал оригинальную программу), кажется, основан на этой ссылке https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/. В исходном приложении не было метода, позволяющего пользователю выйти из системы, поэтому он вызывался только по истечении срока действия токена.

1 ответ

Решение

Как это часто бывает, формирование вопроса о SO побудило меня ответить на мой собственный вопрос.

Экран входа в систему, который он предоставляет, включает веб-просмотр, который сохраняет куки. Принудительное их устранение решило мою проблему. Я также очистил кэш токенов, хотя не думаю, что это решает проблему во всех случаях самостоятельно.

Если я вызываю эту функцию до того, как аннулирую токен бэкэнда, она будет работать, как задумано, и при нажатии для входа в систему мне будет предложено ввести имя пользователя и пароль.

    public void RemoveAuthenticationInfo()
    {
        var authContext = new AuthenticationContext(Authority);
        authContext.TokenCache.Clear();

        Windows.Web.Http.Filters.HttpBaseProtocolFilter myFilter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
        var cookieManager = myFilter.CookieManager;
        HttpCookieCollection myCookieJar = cookieManager.GetCookies(new Uri(Authority));
        foreach (HttpCookie cookie in myCookieJar)
        {
            cookieManager.DeleteCookie(cookie);
        }
    }
Другие вопросы по тегам