Azure Logout Async - PullRequest
       6

Azure Logout Async

0 голосов
/ 11 сентября 2018

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

Я пишу приложение 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 Ответ

0 голосов
/ 12 сентября 2018

Как это часто бывает, формирование вопроса о 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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...