Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ASP.NET Core Identity:
- API, поддерживающий функциональность входа в пользовательский интерфейс.
- Управляет пользователями, паролями, данными профиля, ролями, утверждениями, маркерами, подтверждением электронной почты и т. д.
Пользователи могут создать учетную запись с данными логина, хранящимися в , или использовать внешнего провайдера логина. Поддерживаемые внешние поставщики входа включают Facebook, Google, Учетную запись Майкрософт и Twitter.
Сведения о том, как требовать проверку подлинности для всех пользователей приложений, см. в статье Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией.
Исходный код Identity доступен на GitHub. Шаблон и просмотр созданных файлов для просмотра взаимодействия с шаблоном.
Identity обычно настраивается с помощью базы данных SQL Server для хранения имен пользователей, паролей и данных профиля. Кроме того, можно использовать другое постоянное хранилище, например #REF! Table Storage.
В этом разделе вы узнаете, как с помощью зарегистрировать пользователя, войти в систему и выйти из неё. Примечание: шаблоны обрабатывают имя пользователя и электронную почту как одно и то же. Дополнительные инструкции по созданию приложений, которые используются , см. в разделе "Дальнейшие действия".
Дополнительные сведения о Identity в приложениях Blazor см. в разделе ASP.NET Core Blazor аутентификация и авторизация и последующих статьях в документации Blazor.
ASP.NET Core Identity не связан с Microsoft identity platform. Платформа идентификации Майкрософт
- Эволюция платформы разработчика #REF! Active Directory (#REF! AD).
- Альтернативное решение для идентификации и авторизации в приложениях ASP.NET Core.
ASP.NET Core Identity добавляет функции входа пользовательского интерфейса в ASP.NET Core веб-приложения. Чтобы защитить веб-API и SPA, используйте один из следующих способов:
- Microsoft Entra ID
- Duende Сервер
Duende Identity Server — это платформа OpenID Connect и OAuth 2.0 для ASP.NET Core. Duende Server включает следующие функции безопасности:
- Проверка подлинности как услуга (AaaS)
- Единый вход и выход (SSO) для нескольких типов приложений
- Управление доступом для API
- Шлюз федерации
Important
Компания Duende Software может потребовать лицензионный сбор за использование Duende Server в производственной среде. Дополнительные сведения см. в разделе Миграция с ASP.NET Core .NET 5 на .NET 6.
Дополнительные сведения см. в документации по Duende Server (на веб-сайте ПО Duende).
Просмотрите или скачайте пример кода (как скачать).
Создайте с аутентификацией
Создайте ASP.NET Core Blazor Web App project с отдельными учетными записями.
Note
Для получения полной информации смотрите раздел Создание приложения Pages с авторизацией.
Сведения о интерфейсе MVC см. в разделе "Создание приложения MVC с проверкой подлинности ".
- Выберите шаблон. Нажмите кнопку Далее.
- Сделайте следующие выборы:
- Тип проверки подлинности: отдельные учетные записи
- Режим интерактивной отрисовки: сервер
- Расположение интерактивности: глобальное
- Нажмите кнопку "Создать".
Созданный project включает компоненты IdentityRazor. Компоненты находятся в папке Components/Account серверного проекта. Рассмотрим пример.
Components/Account/Pages/Register.razorComponents/Account/Pages/Login.razorComponents/Account/Pages/Manage/ChangePassword.razor
Компоненты описываются отдельно в документации для конкретных вариантов использования и подлежат изменению каждого выпуска. При создании Blazor Web App с персональными учетными записями, компоненты IdentityRazor включены в созданный проект. Компоненты IdentityRazor также можно проверить в папке Components/Account проекта сервера в шаблоне проекта Blazor Web App (репозиторий GitHub dotnet/aspnetcore).
Note
Ссылки на справочную информацию в .NET обычно загружают основную ветку репозитория, соответствующую текущей разработке для следующего выпуска .NET. Чтобы выбрать тег для конкретного релиза, используйте раскрывающийся список Переключение ветвей или тегов. Дополнительные сведения см. в разделе Как выбрать тег версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Дополнительные сведения см. в разделе ASP.NET Core Blazor аутентификации и авторизации и статьи, которые следуют за ним в документации Blazor. Большинство статей в области Security и Identity основного набора документации ASP.NET Core применяются к приложениям Blazor. Однако набор документации содержит статьи и рекомендации, заменяющие или добавляющие сведения. Мы рекомендуем сначала ознакомиться с общим набором документации ASP.NET Core, а затем получить доступ к статьям в документации BlazorSecurity и Identity.
Создать приложение Pages с аутентификацией
Создайте проект веб-приложения ASP.NET Core (Razor Страницы) с отдельными учетными записями.
- Выберите шаблон веб-приложения ASP.NET Core (Razor Pages). Нажмите кнопку Далее.
- Для типа проверки подлинности выберите отдельные учетные записи.
- Нажмите кнопку "Создать".
Созданный проект предоставляет ASP.NET Core Identity как библиотеку классов (RCL) Razor. Библиотека классов предоставляет точки доступа в области . Рассмотрим пример.
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
Страницы описываются отдельно в документации для конкретных вариантов использования и подлежат изменению каждого выпуска. Чтобы просмотреть все страницы в RCL, см. справочный источник ASP.NET Core (репозиторий dotnet/aspnetcore GitHub, папка Identity/UI/src/Areas/Identity/Pages). Вы можете сформировать отдельные страницы или все страницы в приложении. Дополнительные сведения см. в разделе Scaffold Identity в проектах ASP.NET Core.
Создание приложения MVC с проверкой подлинности
Создайте ASP.NET Core MVC project с отдельными учетными записями.
- Выберите шаблон веб-приложения ASP.NET Core (model-View-Controller). Нажмите кнопку Далее.
- Для типа проверки подлинности выберите отдельные учетные записи.
- Нажмите кнопку "Создать".
Созданный проект предоставляет ASP.NET Core Identity как библиотеку классов Razor (RCL). Библиотека классов основана на Pages и предоставляет конечные точки в области . Рассмотрим пример.
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
Страницы описываются отдельно в документации для конкретных вариантов использования и подлежат изменению каждого выпуска. Чтобы просмотреть все страницы в RCL, см. справочный источник ASP.NET Core (репозиторий dotnet/aspnetcore GitHub, папка Identity/UI/src/Areas/Identity/Pages). Вы можете сформировать отдельные страницы или все страницы в приложении. Дополнительные сведения см. в разделе Scaffold Identity в проектах ASP.NET Core.
Применение миграций
Примените миграции для инициализации базы данных.
Выполните следующую команду в консоли диспетчер пакетов (PMC):
Update-Database
Проверка регистрации и входа
Запустите приложение и зарегистрируйте пользователя. В зависимости от размера экрана может потребоваться выбрать кнопку переключателя навигации, чтобы просмотреть ссылки "Регистрация и вход ".
Просмотр базы данных
- В меню View выберите SQL Server обозреватель объектов (SSOX).
- Перейдите к (localdb)MSSQLLocalDB(SQL Server 13). Щелкните правой кнопкой мыши на dbo.AspNetUsersПросмотр данных:
Настройка служб
Службы добавляются в . Типичным шаблоном является вызов методов в следующем порядке:
Add{Service}builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
builder.Services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Предыдущий код настраивает с параметрами по умолчанию. Службы становятся доступными для приложения с помощью внедрения зависимостей.
включен путем вызова . добавляет посредническое ПО для проверки подлинности в конвейер запросов.
Созданное шаблоном приложение не использует авторизацию. включается, чтобы убедиться, что он добавлен в правильном порядке, если приложение добавит авторизацию. , и должен вызываться в порядке, приведенном в приведенном выше коде.
Для получения дополнительной информации о см. и Запуск приложения.
метрики ASP.NET Core Identity
ASP.NET Core Identity метрики предоставляют возможности мониторинга для процессов управления пользователями и проверки подлинности. Эти метрики помогают обнаруживать необычные шаблоны входа, которые могут указывать на угрозы безопасности, отслеживать производительность операций идентификации и понимать, как пользователи взаимодействуют с функциями проверки подлинности, такими как двухфакторная проверка подлинности. Эта наблюдаемость особенно важна для приложений с строгими требованиями к безопасности или с высоким трафиком проверки подлинности.
Полные сведения о доступных метриках и их использовании см. в разделе метрики ASP.NET Core.
Создание структуры для Регистрация, Вход, Выход и Подтверждение регистрации
Добавьте файлы , , и . Следуйте инструкциям по Scaffold identity в проекте с авторизацией для генерации кода, показанного в этом разделе.
Проверка регистра
Когда пользователь нажимает кнопку "Зарегистрировать" на странице, вызывается действие. Пользователь создается пользователем на объекте .
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Отключение проверки учетной записи по умолчанию
При использовании шаблонов по умолчанию пользователь перенаправляется на место, где можно выбрать ссылку, чтобы подтвердить учетную запись. Значение по умолчанию используется только для тестирования, автоматическая проверка учетной записи должна быть отключена в рабочем приложении.
Чтобы требовать подтвержденную учетную запись и предотвратить немедленный вход при регистрации, задайте в :
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
Вход в систему
Форма входа отображается в следующих случаях:
- Выбрана ссылка на вход .
- Пользователь пытается получить доступ к ограниченной странице, к которой у них нет разрешения, или если они не прошли проверку подлинности системой.
При отправке формы на странице входа вызывается действие . вызывается для объекта.
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Сведения о том, как принимать решения об авторизации, см. в разделе Введение в авторизацию в ASP.NET Core.
Выйти из системы
Ссылка выхода из системы вызывает действие.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
В приведенном выше коде код должен переадресовываться, чтобы браузер выполнял новый запрос и идентификатор пользователя обновился.
очищает утверждения пользователя, хранящиеся в объекте .
Запись указана в :
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Тест
Шаблоны веб-проектов по умолчанию позволяют анонимный доступ к домашним страницам. Чтобы проверить , добавьте :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
Если вы вошли, выйдите. Запустите приложение и выберите ссылку . Вы перейдете на страницу входа.
Исследовать
Чтобы подробнее изучить :
- Полное создание пользовательского интерфейса для удостоверения личности
- Изучите исходный код каждой страницы и пошагово пройдите через отладчик.
Компоненты
Все пакеты NuGet, зависящие от Identity, включены в общую платформу ASP.NET Core.
Основной пакет для — это Microsoft.AspNetCore.. Этот пакет содержит основной набор интерфейсов для ASP.NET Core Identity, и он включен в Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Переход на ASP.NET Core Identity
Дополнительные сведения и рекомендации по переносу существующего хранилища см. в разделе Миграция проверки подлинности и .
Настройка надежности пароля
Смотрите Конфигурация для примера, который задает минимальные требования к паролям.
AddDefaultIdentity и AddIdentity
AddDefaultIdentity появилась в ASP.NET Core 2.1. Вызов аналогичен вызову следующего:
Дополнительные сведения см. в источнике AddDefaultIdentity.
Предотвращение публикации статических ресурсов
Чтобы предотвратить публикацию статических Identity активов (таблиц стилей и файлов JavaScript для пользовательского интерфейса Identity) в корневой каталог веб-сайта, добавьте следующее свойство ResolveStaticWebAssetsInputsDependsOn и цель RemoveIdentityAssets в файл проекта приложения.
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Дальнейшие шаги
- ASP.NET Core Blazor аутентификация и авторизация
- ASP.NET Core Identity исходный код
- Как работать с ролями в ASP.NET Core Identity
- Сведения о настройке Identity с помощью SQLite см. в статье How to config Identity for SQLite (
dotnet/AspNetCore.Docs#5131). - Настройка
- Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией
- Добавление, загрузка и удаление пользовательских данных в Identity в проекте ASP.NET Core
- Включить генерацию QR-кода для приложений-аутентификаторов TOTP в ASP.NET Core
- Перенесите аутентификацию и Identity на ASP.NET Core
- Подтверждение учетной записи и восстановление пароля в ASP.NET Core
- Multi-factor authentication in ASP.NET Core
- Host ASP.NET Core в веб-ферме
Автор: Рик Андерсон (Rick Anderson)
ASP.NET Core Identity:
- API, поддерживающий функциональность входа в пользовательский интерфейс.
- Управляет пользователями, паролями, данными профиля, ролями, утверждениями, маркерами, подтверждением электронной почты и т. д.
Пользователи могут создать учетную запись с данными логина, хранящимися в , или использовать внешнего провайдера логина. Поддерживаемые внешние поставщики входа включают Facebook, Google, Учетную запись Майкрософт и Twitter.
Сведения о том, как требовать проверку подлинности для всех пользователей приложений, см. в статье Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией.
Исходный код Identity доступен на GitHub. Шаблон и просмотр созданных файлов для просмотра взаимодействия с шаблоном.
Identity обычно настраивается с помощью базы данных SQL Server для хранения имен пользователей, паролей и данных профиля. Кроме того, можно использовать другое постоянное хранилище, например #REF! Table Storage.
В этом разделе вы узнаете, как с помощью зарегистрировать пользователя, войти в систему и выйти из неё. Примечание: шаблоны обрабатывают имя пользователя и электронную почту как одно и то же. Дополнительные инструкции по созданию приложений, которые используются , см. в разделе "Дальнейшие действия".
ASP.NET Core Identity не связан с Microsoft identity platform. Платформа идентификации Майкрософт
- Эволюция платформы разработчика #REF! Active Directory (#REF! AD).
- Альтернативное решение для идентификации и авторизации в приложениях ASP.NET Core.
ASP.NET Core Identity добавляет функциональность входа через пользовательский интерфейс в ASP.NET Core веб-приложения. Чтобы защитить веб-API и SPA, используйте один из следующих способов:
- Microsoft Entra ID
- Duende Сервер
Duende Identity Server — это платформа OpenID Connect и OAuth 2.0 для ASP.NET Core. Duende Server включает следующие функции безопасности:
- Проверка подлинности как услуга (AaaS)
- Единый вход и выход (SSO) для нескольких типов приложений
- Контроль доступа для API
- Шлюз федерации
Important
Компания Duende Software может потребовать лицензионный сбор за использование Duende Server в производственной среде. Для получения дополнительной информации см. в разделе Миграция с ASP.NET Core в .NET 5 на .NET 6.
Дополнительные сведения см. в документации по Duende Server (на веб-сайте ПО Duende).
Просмотрите или скачайте пример кода (как скачать).
Создание веб-приложения с проверкой подлинности
Создайте проект веб-приложения ASP.NET Core с индивидуальными учетными записями пользователей.
- Выберите шаблон ASP.NET Core Web App. Назовите проект WebApp1, чтобы иметь такое же пространство имен, как проект загрузки. Нажмите кнопку ОК.
- В поле входных данных Тип проверки подлинности выберите Отдельные учетные записи пользователей.
Созданный проект предоставляет ASP.NET Core Identity как библиотеку классов Razor. Библиотека классов предоставляет точки доступа в области . Рассмотрим пример.
- //Аккаунт/Вход
- //Аккаунт/Выход
- //Аккаунт/Управление
Применение миграций
Примените миграции для инициализации базы данных.
Выполните следующую команду в консоли диспетчер пакетов (PMC):
Update-Database
Проверка регистрации и входа
Запустите приложение и зарегистрируйте пользователя. В зависимости от размера экрана может потребоваться выбрать кнопку переключателя навигации, чтобы просмотреть ссылки "Регистрация и вход ".
Просмотр базы данных
- В меню View выберите SQL Server обозреватель объектов (SSOX).
- Перейдите к (localdb)MSSQLLocalDB(SQL Server 13). Щелкните правой кнопкой мыши на dbo.AspNetUsersПросмотр данных:
Настройка служб
Службы добавляются в . Типичным шаблоном является вызов методов в следующем порядке:
Add{Service}builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
builder.Services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Предыдущий код настраивает с параметрами по умолчанию. Службы становятся доступными для приложения с помощью внедрения зависимостей.
включен путем вызова . добавляет посредническое ПО для проверки подлинности в конвейер запросов.
Созданное шаблоном приложение не использует авторизацию. включается, чтобы убедиться, что он добавлен в правильном порядке, если приложение добавит авторизацию. , и должен вызываться в порядке, приведенном в приведенном выше коде.
Для получения дополнительной информации о см. и Запуск приложения.
Создание структуры для Регистрация, Вход, Выход и Подтверждение регистрации
Добавьте файлы , , и . Следуйте инструкциям по Scaffold identity в проекте с авторизацией для генерации кода, показанного в этом разделе.
Проверка регистра
Когда пользователь нажимает кнопку "Зарегистрировать" на странице, вызывается действие. Пользователь создается пользователем на объекте .
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Отключение проверки учетной записи по умолчанию
При использовании шаблонов по умолчанию пользователь перенаправляется на место, где можно выбрать ссылку, чтобы подтвердить учетную запись. Значение по умолчанию используется только для тестирования, автоматическая проверка учетной записи должна быть отключена в рабочем приложении.
Чтобы требовать подтвержденную учетную запись и предотвратить немедленный вход при регистрации, задайте в :
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
Вход в систему
Форма входа отображается в следующих случаях:
- Выбрана ссылка на вход .
- Пользователь пытается получить доступ к ограниченной странице, к которой у них нет разрешения, или если они не прошли проверку подлинности системой.
При отправке формы на странице входа вызывается действие . вызывается для объекта.
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Сведения о том, как принимать решения об авторизации, см. в разделе Введение в авторизацию в ASP.NET Core.
Выйти из системы
Ссылка выхода из системы вызывает действие.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
В приведенном выше коде код должен переадресовываться, чтобы браузер выполнял новый запрос и идентификатор пользователя обновился.
очищает утверждения пользователя, хранящиеся в объекте .
Запись указана в :
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Тест
Шаблоны веб-проектов по умолчанию позволяют анонимный доступ к домашним страницам. Чтобы проверить , добавьте :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
Если вы вошли, выйдите. Запустите приложение и выберите ссылку . Вы перейдете на страницу входа.
Исследовать
Чтобы подробнее изучить :
- Полное создание пользовательского интерфейса для удостоверения личности
- Изучите исходный код каждой страницы и пошагово пройдите через отладчик.
Компоненты
Все пакеты NuGet, зависящие от Identity, включены в общую платформу ASP.NET Core.
Основной пакет для — это Microsoft.AspNetCore.. Этот пакет содержит основной набор интерфейсов для ASP.NET Core Identity, и он включен в Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Переход на ASP.NET Core Identity
Дополнительные сведения и рекомендации по переносу существующего хранилища см. в разделе Миграция проверки подлинности и .
Настройка надежности пароля
Смотрите Конфигурация для примера, который задает минимальные требования к паролям.
AddDefaultIdentity и AddIdentity
AddDefaultIdentity появилась в ASP.NET Core 2.1. Вызов аналогичен вызову следующего:
Дополнительные сведения см. в источнике AddDefaultIdentity.
Предотвращение публикации статических ресурсов
Чтобы предотвратить публикацию статических Identity активов (таблиц стилей и файлов JavaScript для пользовательского интерфейса Identity) в корневой каталог веб-сайта, добавьте следующее свойство ResolveStaticWebAssetsInputsDependsOn и цель RemoveIdentityAssets в файл проекта приложения.
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Дальнейшие шаги
- Дополнительные сведения о настройке Identity см. в GitHub issue.
- Настройка
- Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией
- Добавление, загрузка и удаление пользовательских данных в Identity в проекте ASP.NET Core
- Включить генерацию QR-кода для приложений-аутентификаторов TOTP в ASP.NET Core
- Перенесите аутентификацию и Identity на ASP.NET Core
- Подтверждение учетной записи и восстановление пароля в ASP.NET Core
- Твофакторная проверка подлинности с помощью SMS в ASP.NET Core
- Host ASP.NET Core в веб-ферме
Автор: Рик Андерсон (Rick Anderson)
ASP.NET Core Identity:
- API, поддерживающий функциональность входа в пользовательский интерфейс.
- Управляет пользователями, паролями, данными профиля, ролями, утверждениями, маркерами, подтверждением электронной почты и т. д.
Пользователи могут создать учетную запись с данными логина, хранящимися в , или использовать внешнего провайдера логина. Поддерживаемые внешние поставщики входа включают Facebook, Google, Учетную запись Майкрософт и Twitter.
Сведения о том, как требовать проверку подлинности для всех пользователей приложений, см. в статье Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией.
Исходный код Identity доступен на GitHub. Шаблон и просмотр созданных файлов для просмотра взаимодействия с шаблоном.
Identity обычно настраивается с помощью базы данных SQL Server для хранения имен пользователей, паролей и данных профиля. Кроме того, можно использовать другое постоянное хранилище, например #REF! Table Storage.
В этом разделе вы узнаете, как с помощью зарегистрировать пользователя, войти в систему и выйти из неё. Примечание: шаблоны обрабатывают имя пользователя и электронную почту как одно и то же. Дополнительные инструкции по созданию приложений, которые используются , см. в разделе "Дальнейшие действия".
Платформа идентификации Microsoft:
- Эволюция платформы разработчика #REF! Active Directory (#REF! AD).
- Альтернативное решение для идентификации и авторизации в приложениях ASP.NET Core.
- Не связан с ASP.NET Core Identity.
ASP.NET Core Identity добавляет функции входа пользовательского интерфейса в ASP.NET Core веб-приложения. Чтобы защитить веб-API и SPA, используйте один из следующих способов:
- Microsoft Entra ID
- Duende IdentityServer. Duende IdentityServer — это сторонний продукт.
Duende IdentityServer — это платформа OpenID Connect и OAuth 2.0 для ASP.NET Core. Duende IdentityServer включает следующие функции безопасности:
- Проверка подлинности как услуга (AaaS)
- Единый вход и выход (SSO) для нескольких типов приложений
- Управление доступом для API
- Шлюз федерации
Дополнительные сведения см. в разделе "Обзор Duende IdentityServer".
Дополнительные сведения о других поставщиках проверки подлинности см. в разделе Коммюнити варианты аутентификации OSS для ASP.NET Core
Просмотрите или скачайте пример кода (как скачать).
Создание веб-приложения с проверкой подлинности
Создайте проект веб-приложения ASP.NET Core с индивидуальными учетными записями пользователей.
- Выберите File>New>Project.
- Выберите ASP.NET Core веб-приложение. Назовите проект WebApp1, чтобы иметь такое же пространство имен, как проект загрузки. Нажмите кнопку ОК.
- Выберите ASP.NET Core Web Application, а затем выберите Изменить аутентификацию.
- Выберите отдельные учетные записи пользователей и нажмите кнопку "ОК".
Созданный проект предоставляет ASP.NET Core Identity как библиотеку классов Razor. Библиотека классов предоставляет точки доступа в области . Рассмотрим пример.
- //Аккаунт/Вход
- //Аккаунт/Выход
- //Аккаунт/Управление
Применение миграций
Примените миграции для инициализации базы данных.
Выполните следующую команду в консоли диспетчер пакетов (PMC):
PM> Update-Database
Проверка регистрации и входа
Запустите приложение и зарегистрируйте пользователя. В зависимости от размера экрана может потребоваться выбрать кнопку переключателя навигации, чтобы просмотреть ссылки "Регистрация и вход ".
Просмотр базы данных
- В меню View выберите SQL Server обозреватель объектов (SSOX).
- Перейдите к (localdb)MSSQLLocalDB(SQL Server 13). Щелкните правой кнопкой мыши на dbo.AspNetUsersПросмотр данных:
Настройка служб
Службы добавляются в . По стандартному шаблону сначала вызываются все методы , а затем все методы .
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlite(
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
}
Предыдущий выделенный код настраивает со значениями параметров по умолчанию. Службы становятся доступными для приложения с помощью внедрения зависимостей.
включен путем вызова . добавляет посредническое ПО для проверки подлинности в конвейер запросов.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlite(
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
}
Предыдущий код настраивает с параметрами по умолчанию. Службы становятся доступными для приложения с помощью внедрения зависимостей.
включен путем вызова . добавляет посредническое ПО для проверки подлинности в конвейер запросов.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Созданное шаблоном приложение не использует авторизацию. включается, чтобы убедиться, что он добавлен в правильном порядке, если приложение добавит авторизацию. , , и должен вызываться в порядке, приведенном в предыдущем коде.
Дополнительные сведения о и см. в разделе и Запуск приложения.
Создание структуры для Регистрация, Вход, Выход и Подтверждение регистрации
Добавьте файлы , , и . Следуйте инструкциям по Scaffold identity в проекте с авторизацией для генерации кода, показанного в этом разделе.
Проверка регистра
Когда пользователь нажимает кнопку "Зарегистрировать" на странице, вызывается действие. Пользователь создается пользователем на объекте .
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Отключение проверки учетной записи по умолчанию
При использовании шаблонов по умолчанию пользователь перенаправляется на место, где можно выбрать ссылку, чтобы подтвердить учетную запись. Значение по умолчанию используется только для тестирования, автоматическая проверка учетной записи должна быть отключена в рабочем приложении.
Чтобы требовать подтвержденную учетную запись и предотвратить немедленный вход при регистрации, задайте в :
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
Вход в систему
Форма входа отображается в следующих случаях:
- Выбрана ссылка на вход .
- Пользователь пытается получить доступ к ограниченной странице, к которой у них нет разрешения, или если они не прошли проверку подлинности системой.
При отправке формы на странице входа вызывается действие . вызывается для объекта.
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Сведения о том, как принимать решения об авторизации, см. в разделе Введение в авторизацию в ASP.NET Core.
Выйти из системы
Ссылка выхода из системы вызывает действие.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
В приведенном выше коде код должен переадресовываться, чтобы браузер выполнял новый запрос и идентификатор пользователя обновился.
очищает утверждения пользователя, хранящиеся в объекте .
Запись указана в :
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Тест
Шаблоны веб-проектов по умолчанию позволяют анонимный доступ к домашним страницам. Чтобы проверить , добавьте :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
Если вы вошли, выйдите. Запустите приложение и выберите ссылку . Вы перейдете на страницу входа.
Исследовать
Чтобы подробнее изучить :
- Полное создание пользовательского интерфейса для удостоверения личности
- Изучите исходный код каждой страницы и пошагово пройдите через отладчик.
Компоненты
Все пакеты NuGet, зависящие от Identity, включены в общую платформу ASP.NET Core.
Основной пакет для — это Microsoft.AspNetCore.. Этот пакет содержит основной набор интерфейсов для ASP.NET Core Identity, и он включен в Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Переход на ASP.NET Core Identity
Дополнительные сведения и рекомендации по переносу существующего хранилища см. в разделе Миграция проверки подлинности и .
Настройка надежности пароля
Смотрите Конфигурация для примера, который задает минимальные требования к паролям.
Предотвращение публикации статических ресурсов
Чтобы предотвратить публикацию статических Identity активов (таблиц стилей и файлов JavaScript для пользовательского интерфейса Identity) в корневой каталог веб-сайта, добавьте следующее свойство ResolveStaticWebAssetsInputsDependsOn и цель RemoveIdentityAssets в файл проекта приложения.
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Дальнейшие шаги
- ASP.NET Core Identity исходный код
- источник AddDefaultIdentity
- Дополнительные сведения о настройке Identity см. в GitHub issue.
- Настройка
- Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией
- Добавление, загрузка и удаление пользовательских данных в Identity в проекте ASP.NET Core
- Включить генерацию QR-кода для приложений-аутентификаторов TOTP в ASP.NET Core
- Перенесите аутентификацию и Identity на ASP.NET Core
- Подтверждение учетной записи и восстановление пароля в ASP.NET Core
- Твофакторная проверка подлинности с помощью SMS в ASP.NET Core
- Host ASP.NET Core в веб-ферме
ASP.NET Core