Невозможно войти с другой учетной записью или «Использовать другую учетную запись» - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь интегрировать Microsoft sso с приложением Xamarin.Forms.

Я использую Microsoft.Identity.Client 4.7.1

Я изо всех сил пытаюсь войти в систему с разными учетными записями на одном устройстве, так как кажется, что первая учетная запись всегда выбирается независимо от того, что я делать.

  1. Пользователь A входит в систему
  2. Пользователь A выходит из системы
  3. Пользователь B входит в приложение, открывает веб-просмотр со страницей входа Microsoft и предлагает «Использовать другую учетную запись» Кнопка, но даже после ввода его учетной записи, веб-просмотр перенаправляет его обратно в мобильное приложение как пользователь A.

Вот код, который обрабатывает вход и выход:


private IPublicClientApplication _publicClientApplication;

public AuthService()
{
    _publicClientApplication = PublicClientApplicationBuilder.Create(Constants.MicrosoftAuthConstants.ClientId.Value)
        .WithAdfsAuthority(Constants.MicrosoftAuthConstants.Authority.Value)
        .WithRedirectUri(Constants.MicrosoftAuthConstants.RedirectUri.Value)
        .Build();
}

public async Task<string> SignInAsync()
{
    var authScopes = Constants.MicrosoftAuthConstants.Scopes.Value;
    AuthenticationResult authResult;

    try
    {
        // call to _publicClientApplication.AcquireTokenSilent
        authResult = await GetAuthResultSilentlyAsync();
    }
    catch (MsalUiRequiredException)
    {
        authResult = await _publicClientApplication.AcquireTokenInteractive(authScopes)
                  .WithParentActivityOrWindow(App.ParentWindow)
                  .ExecuteAsync();
    }

    return authResult.AccessToken;
}

private async Task<IAccount> GetCachedAccountAsync() => (await _publicClientApplication.GetAccountsAsync()).FirstOrDefault();

public async Task SignOutAsync()
{
    var firstCachedAccount = await GetCachedAccountAsync();
    await _publicClientApplication.RemoveAsync(firstCachedAccount);
}

Обходной путь должен использовать Prompt.ForceLogin, но какой смысл в sso, если вам приходится каждый раз вводить учетные данные.

1 Ответ

1 голос
/ 27 февраля 2020

Строка кода await _publicClientApplication.RemoveAsync(firstCachedAccount); может удалить пользователя из кэша, в нем не реализован метод выхода из системы. Таким образом, вам нужно сделать выход вручную с помощью api ниже:

https://login.microsoftonline.com/common/oauth2/v2.0/logout?post_logout_redirect_uri=https://localhost/myapp/
...