Я создаю приложение .NET Framework 4.8, в котором пользователи должны входить в систему с учетной записью организации (Azure AD). Цель состоит в том, чтобы обеспечить аутентификацию без показа других учетных записей Microsoft, которые ранее входили в систему на общем компьютере (он расположен в больнице и используется несколькими лаборантами). Я использую MSAL для аутентификации.
Проблема:
При использовании .WithLoginHint(currentWindowsUser) экран выбора учетной записи скрыт, и MSAL пытается для автоматического входа в систему. Однако он пропускает запрос пароля, даже если требуется повторная аутентификация. Это соответствует проблеме GitHub № 4133, где WithLoginHint обходит необходимые взаимодействия с пользовательским интерфейсом, такие как ввод пароля. Эта проблема активна с мая 2023 года.
Без .WithLoginHint в приглашении на вход отображается несколько учетных записей «Подключено в Windows» (в меню «Настройки» > «Учетные записи» > «Электронная почта и учетные записи»). Эти учетные записи не отображаются в WAM или реестре, что затрудняет их программную фильтрацию.
Желаемое поведение:
- Пользователи должны иметь возможность проходить аутентификацию только с помощью своей учетной записи Microsoft (Azure AD).
- Другие учетные записи (например, учетные записи «Подключено в Windows») не должны отображаться. .
- А Запрос пароля должен появляться всегда, даже если пользователь уже прошел аутентификацию в Windows.
Код: Выделить всё
public async Task AcquireTokenInteractiveAsync()
{
try
{
// Get the current Windows user (UPN)
string currentWindowsUser;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
UserPrincipal user = UserPrincipal.Current;
currentWindowsUser = user.UserPrincipalName; // e.g., "[email protected]"
}
// Configure the MSAL token request
var oBuilder = m_oClientApp.AcquireTokenInteractive(scopes: new[] { "User.Read" })
.WithPrompt(Prompt.Consent) // Shows unwanted accounts
//.WithLoginHint(currentWindowsUser) // Skips password prompt
.WithUseEmbeddedWebView(useEmbeddedWebView: true)
.WithParentActivityOrWindow(parent: m_oGetParentWindowFunc)
.WithExtraQueryParameters($"login_hint={currentWindowsUser}"); // Workaround for login hint, doesn't seem to work either.
// Execute the token request
AuthenticationResult oResult = await oBuilder.ExecuteAsync();
return oResult;
}
catch (MsalClientException oEx) when (oEx.ErrorCode == "redirect_uri_mismatch")
{
Debug.WriteLine($"Redirect URI configuratie fout: {oEx.Message}");
throw new AzureAuthenticationException("Redirect URI configuratie incorrect. Controleer Azure Portal instellingen.", oEx);
}
catch (Exception oEx)
{
Debug.WriteLine($"Interactie authenticatie fout: {oEx.Message}");
throw new AzureAuthenticationException("Interactie authenticatie mislukt. Controleer uw inloggegevens.", oEx);
}
}
- С .WithLoginHint:
- Экран выбора учетной записи скрыт.
- MSAL автоматически проверяет подлинность, не запрашивая пароль (даже если требуется повторная аутентификация).
- li>
- Без .WithLoginHint:
- В приглашении на вход отображается несколько учетных записей «Подключено в Windows» (в меню «Настройки» > «Учетные записи» > «Электронная почта и учетные записи»). ).
- Эти учетные записи не отображаются в WAM или реестре, что затрудняет их фильтрацию.
- .WithPrompt Variations:
- Prompt.ForceLogin, Prompt.SelectAccount, Prompt.Consent.
- Результат: либо пропуск запроса пароля, либо отображение нежелательных учетных записей.
- Кэш вручную Удаление:
Код: Выделить всё
var accounts = await m_oClientApp.GetAccountsAsync();
foreach (var acc in accounts) await m_oClientApp.RemoveAsync(acc);
- Результат: нет эффекта (встроенная проверка подлинности Windows по-прежнему обходит запрос).
- Параметры запроса:
- .WithExtraQueryParameters($"login_hint={currentWindowsUser}");
- Результат: нет эффекта
- .NET Framework 4.8
- Машины, присоединенные к домену Windows.
- Учетные записи организации Azure AD.
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-accounts