Я создаю приложение .NET Framework 4.8, в котором пользователи должны войти в систему, используя свою текущую учетную запись организации Windows (Azure AD). Цель состоит в том, чтобы обеспечить проверку подлинности только для той учетной записи, под которой они вошли в Windows, без отображения других учетных записей. Я использую MSAL для аутентификации.
Проблема:
При использовании .WithLoginHint(currentWindowsUser) экран выбора учетной записи скрыт, и MSAL пытается для автоматического входа в систему. Однако он пропускает запрос пароля, даже если требуется повторная аутентификация. Это соответствует проблеме GitHub № 4133, где WithLoginHint обходит необходимые взаимодействия с пользовательским интерфейсом, такие как ввод пароля. Эта проблема активна с мая 2023 года...
https://github.com/AzureAD/microsoft-au ... ssues/4133
Без .WithLoginHint в приглашении для входа в систему отображается несколько учетных записей «Подключено в Windows» (из «Настройки» > «Учетные записи» > «Электронная почта и учетные записи»). Эти учетные записи не отображаются в WAM или реестре, что затрудняет их программную фильтрацию.
Желаемое поведение:
- Пользователи должны иметь возможность проходить аутентификацию только с той учетной записью, которую они использовали для входа в сеанс Windows.
- Другие учетные записи (например, учетные записи «Подключено в 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>
- В приглашении на вход отображается несколько учетных записей «Подключено в 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}");
Как я могу:
[*]Принудительно запрашивать пароль для текущей учетной записи организации Windows, даже если пользователь уже прошел проверку подлинности в Windows?
[*]Запретить отображение учетных записей «Подключено в Windows» (из «Настройки» > «Учетные записи» > «Электронная почта и учетные записи») в приглашении для входа в систему?
[*]Убедиться, что пользователи могут проходить аутентификацию только с той учетной записью, которую они использовали для входа в сеанс Windows?
< /ol>
Среда:
- .NET Framework 4.8
- Машины, присоединенные к домену Windows.
- Учетные записи организации Azure AD.
Ответы, предлагающие обновление до .NET 5+, невозможны.
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-accounts