Я только что создал приложение .Net Core App с помощью документации, которое аутентифицируется с Azure Active Directory.

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins?view=aspnetcore-5.0

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

Когда я впервые вхожу в систему, она просит меня связать электронную почту с учетной записью. Почему так? Насколько я понимаю, основываясь на базе данных, вы можете войти в систему без реального присутствия пользователя во внутренней базе данных пользователей. Так сказать, мягкая аутентификация.

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

  1. Почему такое раздвоение… после того, как я хочу автоматически создать их как пользователей с тем же именем пользователя?

  2. После того как я создал пользователя и вошел в систему во второй раз, почему приложение "из коробки" просит их связать адрес электронной почты во второй раз? Что приведет к ошибке как дублирующая запись. Разве представление не должно сначала проверить, существует ли пользователь, прежде чем выводить этот текст?

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

Самое главное, я могу попытаться взломать его и автоматически войти в систему, минуя этот шаг с электронной почтой, но есть ли способ сделать это через настройки?

Спасибо!

Ответы (2)

Ассоциирование электронной почты с учетной записью должно быть ожидаемым поведением.

Теперь, когда вы выбрали использование Индивидуальных учетных записей пользователей для входа в ваше приложение .Net Core, хотя вы вошли с учетной записью Microsoft, в настоящее время в приложении нет индивидуальной учетной записи пользователя.

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

  1. Почему раздвоение… после того, как я не хочу создавать их как пользователя автоматически с тем же именем пользователя?

Возможно, ваша идея разумна, но будут пользователи, которые используют электронную почту, отличную от учетных записей Microsoft. И не все рабочие учетные записи AAD имеют почтовый ящик, если у них нет подписки O365 с лицензией Exchange Online. В этом случае им придется использовать другую электронную почту.

  1. После того, как я создал пользователя и вошел в систему во второй раз, почему приложение "из коробки" просит связать адрес электронной почты во второй раз? Что приведет к ошибке как дублирующая запись. Разве представление не должно сначала проверить, существует ли пользователь, прежде чем выводить этот текст?

Это связано с тем, что вы не подтвердили свою учетную запись. Когда вы впервые создаете пользователя (нажимаете на Register после входа с учетной записью Microsoft), вы перенаправляетесь на страницу /Identity/Account/RegisterConfirmation, которая содержит ссылку для имитации подтверждения электронной почты:

  1. Выберите ссылку Click here to confirm your account link. 2. Выберите ссылку Login и войдите в систему с теми же учетными данными.

Then you won't be required to Register any more.

enter image description here

В руководстве, которому вы следуете, установлено options.SignIn.RequireConfirmedAccount = true, попробуйте установить false, как показано ниже, чтобы пропустить подтверждение.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
    });
}

2022 WebDevInsider