Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
ASP.NET Core-Identity:
- Is een API die aanmeldingsfunctionaliteit van de gebruikersinterface (UI) ondersteunt.
- Beheert gebruikers, wachtwoorden, profielgegevens, rollen, claims, tokens, e-mailbevestiging en meer.
Gebruikers kunnen een account maken met de aanmeldingsgegevens die zijn opgeslagen in Identity of ze kunnen een externe aanmeldingsprovider gebruiken. Ondersteunde externe aanmeldingsproviders zijn Facebook, Google, Microsoft-account en Twitter.
Zie Geverifieerde gebruikers vereisen voor informatie over het globaal vereisen dat alle gebruikers worden geverifieerd.
De Identity broncode is beschikbaar op GitHub. Scaffold Identity en bekijk de gegenereerde bestanden om de interactie met de sjabloon Identity te controleren.
Identity wordt doorgaans geconfigureerd met behulp van een SQL Server-database voor het opslaan van gebruikersnamen, wachtwoorden en profielgegevens. U kunt ook een ander permanent archief gebruiken, bijvoorbeeld Azure Table Storage.
In dit onderwerp leert u hoe u Identity kunt gebruiken om een gebruiker te registreren, aan te melden en af te melden. Opmerking: de sjablonen behandelen gebruikersnaam en e-mail als dezelfde voor gebruikers. Zie Identityvoor meer gedetailleerde instructies over het maken van apps die gebruikmaken van .
Voor meer informatie over Identity in Blazor apps, zie ASP.NET Core-verificatie Blazor en -autorisatie, en de artikelen die daarop volgen in de Blazor documentatie.
ASP.NET Core Identity is niet gerelateerd aan het Microsoft Identity Platform. Microsoft identiteitsplatform is:
- Een evolutie van het Azure Ad-ontwikkelaarsplatform (Azure Active Directory).
- Een alternatieve identiteitsoplossing voor verificatie en autorisatie in ASP.NET Core-apps.
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Important
Duende Software vereist mogelijk dat u een licentiekosten betaalt voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.
Zie de documentatie van Duende Server (Duende Identity Software-website) voor meer informatie.
Bekijk of download de voorbeeldcode (downloaden).
Een Blazor Web App maken met de verificatie.
Maak een ASP.NET Core-project Blazor Web App met afzonderlijke accounts.
Note
Zie de sectie Razor voor een Razor Pagina's-ervaring.
Zie de sectie Een MVC-app maken met verificatie voor een MVC-ervaring .
- Selecteer de Blazor Web App sjabloon. Kies Volgende.
- Maak de volgende selecties:
- Verificatietype: Afzonderlijke accounts
- interactieve weergavemodus: Server
- Locatie van interactiviteit: globaal
- Klik op Creëren.
Het gegenereerde project bevat IdentityRazor onderdelen. De onderdelen bevinden zich in de Components/Account map van het serverproject. Voorbeeld:
Components/Account/Pages/Register.razorComponents/Account/Pages/Login.razorComponents/Account/Pages/Manage/ChangePassword.razor
Identity
Razor onderdelen worden afzonderlijk beschreven in de documentatie voor specifieke gebruiksvoorbeelden en kunnen elke release worden gewijzigd. Wanneer u een Blazor Web App genereert met individuele accounts, worden IdentityRazor onderdelen opgenomen in het gegenereerde project. De IdentityRazor onderdelen kunnen ook worden geïnspecteerd in de Components/Account map van het serverproject in de Blazor Web App projectsjabloon (dotnet/aspnetcoreGitHub-opslagplaats).
Note
Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.
Zie ASP.NET Core-verificatie Blazor en -autorisatie en de artikelen die deze volgen in de Blazor documentatie voor meer informatie. De meeste artikelen in het gebied Beveiliging en Identity gebied van de belangrijkste ASP.NET Core-documentatie zijn van toepassing op Blazor apps. De Blazor documentatieset bevat echter artikelen en richtlijnen die informatie vervangen of toevoegen. We raden u aan eerst de algemene ASP.NET Core-documentatieset te bestuderen, gevolgd door toegang te krijgen tot de artikelen in beveiliging Blazoren Identity documentatie.
Een Razor Pages-app maken met authenticatie
Maak een ASP.NET Core-webtoepassingsproject (Razor pagina's) met afzonderlijke accounts.
- Selecteer de ASP.NET Core Web App (RazorPagina's) sjabloon. Kies Volgende.
- Voor Authenticatietype selecteert u Afzonderlijke Accounts.
- Klik op Creëren.
Het gegenereerde project biedt ASP.NET Core Identity als een Razor klassebibliotheek (RCL). De IdentityRazor classbibliotheek biedt toegang tot eindpunten binnen het Identity gebied. Voorbeeld:
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
Pagina's worden afzonderlijk beschreven in de documentatie voor specifieke gebruiksvoorbeelden en kunnen elke release wijzigen. Als u alle pagina's in de RCL wilt bekijken, raadpleegt u de ASP.NET Core-referentiebron (dotnet/aspnetcore GitHub-opslagplaats, Identity/UI/src/Areas/Identity/Pages map). U kunt afzonderlijke pagina's of alle pagina's voor de app genereren. Zie Scaffold Identity in ASP.NET Core-projectenvoor meer informatie.
Een MVC-app maken met verificatie
Maak een ASP.NET Core MVC-project met afzonderlijke accounts.
- Selecteer de sjabloon ASP.NET Core Web App (Model-View-Controller). Kies Volgende.
- Voor Authenticatietype selecteert u Afzonderlijke Accounts.
- Klik op Creëren.
Het gegenereerde project biedt ASP.NET Core Identity als een Razor klassebibliotheek (RCL). De IdentityRazor klassebibliotheek is gebaseerd op Razor Pagina's en toont eindpunten met het Identity gebied. Voorbeeld:
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
Pagina's worden afzonderlijk beschreven in de documentatie voor specifieke gebruiksvoorbeelden en kunnen elke release wijzigen. Als u alle pagina's in de RCL wilt bekijken, raadpleegt u de ASP.NET Core-referentiebron (dotnet/aspnetcore GitHub-opslagplaats, Identity/UI/src/Areas/Identity/Pages map). U kunt afzonderlijke pagina's of alle pagina's voor de app genereren. Zie Scaffold Identity in ASP.NET Core-projectenvoor meer informatie.
Voer migraties uit
Pas de migraties toe voor het initialiseren van de database.
Voer de volgende opdracht uit in de Package Manager Console (PMC):
Update-Database
Registratie en inloggen testen
Voer de app uit en registreer een gebruiker. Afhankelijk van de schermgrootte moet u mogelijk de wisselknop voor navigatie selecteren om de koppelingen registreren en aanmelden weer te geven.
De Identity-database weergeven
- Selecteer in het menu Beeldde optie SQL Server Object Explorer (SSOX).
- Navigeer naar (localdb)MSSQLLocalDB(SQL Server 13). Klik met de rechtermuisknop op dbo.AspNetUsers>Gegevens weergeven:
Diensten van Identity configureren
Services worden toegevoegd in Program.cs. Het gebruikelijke patroon is het aanroepen van methoden in de volgende volgorde:
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();
De voorgaande code configureert Identity met standaardoptiewaarden. Services worden beschikbaar gesteld voor de app via afhankelijkheidsinjectie.
Identity is ingeschakeld door UseAuthenticationaan te roepen.
UseAuthentication voegt verificatie-middleware toe aan de aanvraagpijplijn.
De door de sjabloon gegenereerde app maakt geen gebruik van autorisatie.
app.UseAuthorization is opgenomen om ervoor te zorgen dat deze in de juiste volgorde wordt toegevoegd als de app autorisatie toevoegt.
UseRouting, UseAuthenticationen UseAuthorization moeten worden aangeroepen in de volgorde die in de voorgaande code wordt weergegeven.
Zie IdentityOptions en IdentityOptionsvoor meer informatie over .
Scaffold Registreren, Inloggen, Uitloggen en Registratiebevestiging
Voeg de bestanden Register, Login, LogOuten RegisterConfirmation toe. Volg de scaffold-identiteit in een Razor project met autorisatie-instructies voor het genereren van de code die in deze sectie wordt weergegeven.
Register onderzoeken
Wanneer een gebruiker op de knop Registreren op de Register pagina klikt, wordt de RegisterModel.OnPostAsync actie aangeroepen. De gebruiker wordt gemaakt door CreateAsync(TUser) op het _userManager-object:
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();
}
Standaardaccountverificatie uitschakelen
Met de standaardsjablonen wordt de gebruiker omgeleid naar de Account.RegisterConfirmation waar ze een koppeling kunnen selecteren om het account te laten bevestigen. De standaardwaarde Account.RegisterConfirmation wordt alleen gebruikt voor testen. Automatische accountverificatie moet worden uitgeschakeld in een productie-app.
Als u een bevestigd account wilt vereisen en onmiddellijke aanmelding bij de registratie wilt voorkomen, stelt u DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.csin:
[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();
}
}
Aanmelden
Het aanmeldingsformulier wordt weergegeven wanneer:
- De koppeling Aanmelden is geselecteerd.
- Een gebruiker probeert toegang te krijgen tot een beperkte pagina waarvoor hij geen toestemming heeft of wanneer hij niet door het systeem is geverifieerd.
Wanneer het formulier op de aanmeldingspagina wordt verzonden, wordt de actie OnPostAsync aangeroepen.
PasswordSignInAsync wordt aangeroepen op het _signInManager-object.
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();
}
Zie Inleiding tot autorisatie in ASP.NET Core voor meer informatie over het nemen van autorisatiebeslissingen.
Uitloggen
De koppeling Afmelden roept de LogoutModel.OnPost actie aan.
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();
}
}
}
}
In de voorgaande code moet de code return RedirectToPage(); een omleiding zijn, zodat de browser een nieuwe aanvraag uitvoert en de identiteit voor de gebruiker wordt bijgewerkt.
SignOutAsync wist de claims van de gebruiker die zijn opgeslagen in een cookie.
De post is gespecificeerd in de Pages/Shared/_LoginPartial.cshtml:
@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>
Test Identity
Met de standaardwebprojectsjablonen is anonieme toegang tot de startpagina's toegestaan. Als u Identitywilt testen, voegt u [Authorize]toe:
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()
{
}
}
}
Als u bent aangemeld, meldt u zich af. Voer de app uit en selecteer de koppeling Privacy. U wordt omgeleid naar de aanmeldingspagina.
Verken Identity
Meer informatie over Identity:
- Gebruikersinterfacebron voor volledige identiteit maken
- Bekijk de bron van elke pagina en doorloop het foutopsporingsprogramma.
Identity onderdelen
IdentityAlle -afhankelijke NuGet-pakketten zijn opgenomen in het gedeelde ASP.NET Core-framework.
Het primaire pakket is IdentityMicrosoft.AspNetCore.Identity. Dit pakket bevat de kernset interfaces voor ASP.NET Core Identityen is opgenomen in Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Migreren naar ASP.NET Core-Identity
Zie Identity voor meer informatie en richtlijnen over het migreren van uw bestaande Identity store.
Wachtwoordsterkte instellen
Zie Configuratie voor een voorbeeld waarmee de minimale wachtwoordvereisten worden ingesteld.
AddDefaultIdentity en AddIdentity
AddDefaultIdentity werd geïntroduceerd in ASP.NET Core 2.1. Bellen AddDefaultIdentity is vergelijkbaar met het aanroepen van het volgende:
Zie AddDefaultIdentity-bron voor meer informatie.
Publicatie van statische Identity assets voorkomen
Om te voorkomen dat statische Identity assets (opmaakmodellen en JavaScript-bestanden voor Identity gebruikersinterface) naar de webroot worden gepubliceerd, voeg de volgende ResolveStaticWebAssetsInputsDependsOn eigenschap en RemoveIdentityAssets doel toe aan het projectbestand van de app:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Volgende stappen
- ASP.NET Core Blazor verificatie en autorisatie
- ASP.NET Core-broncode Identity
- Werken met rollen in ASP.NET Core Identity
- Zie Identity voor meer informatie over het configureren van Identity met SQLite.
- Configureren Identity
- Een ASP.NET Core-app maken met gebruikersgegevens die worden beveiligd door autorisatie
- Gebruikersgegevens Identity toevoegen, downloaden en verwijderen in een ASP.NET Core-project
- Het genereren van QR-code inschakelen voor TOTP Authenticator-apps in ASP.NET Core
- Verificatie migreren en Identity naar ASP.NET Core
- Accountbevestiging en wachtwoordherstel in ASP.NET Core
- Meervoudige verificatie in ASP.NET Core
- Host ASP.NET Core in een webfarm
Door Rick Anderson
ASP.NET Core-Identity:
- Is een API die aanmeldingsfunctionaliteit van de gebruikersinterface (UI) ondersteunt.
- Beheert gebruikers, wachtwoorden, profielgegevens, rollen, claims, tokens, e-mailbevestiging en meer.
Gebruikers kunnen een account maken met de aanmeldingsgegevens die zijn opgeslagen in Identity of ze kunnen een externe aanmeldingsprovider gebruiken. Ondersteunde externe aanmeldingsproviders zijn Facebook, Google, Microsoft-account en Twitter.
Zie Geverifieerde gebruikers vereisen voor informatie over het globaal vereisen dat alle gebruikers worden geverifieerd.
De Identity broncode is beschikbaar op GitHub. Scaffold Identity en bekijk de gegenereerde bestanden om de interactie met de sjabloon Identity te controleren.
Identity wordt doorgaans geconfigureerd met behulp van een SQL Server-database voor het opslaan van gebruikersnamen, wachtwoorden en profielgegevens. U kunt ook een ander permanent archief gebruiken, bijvoorbeeld Azure Table Storage.
In dit onderwerp leert u hoe u Identity kunt gebruiken om een gebruiker te registreren, aan te melden en af te melden. Opmerking: de sjablonen behandelen gebruikersnaam en e-mail als dezelfde voor gebruikers. Zie Identityvoor meer gedetailleerde instructies over het maken van apps die gebruikmaken van .
ASP.NET Core Identity is niet gerelateerd aan het Microsoft Identity Platform. Microsoft identiteitsplatform is:
- Een evolutie van het Azure Ad-ontwikkelaarsplatform (Azure Active Directory).
- Een alternatieve identiteitsoplossing voor verificatie en autorisatie in ASP.NET Core-apps.
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Server
Duende Identity Server is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende Identity Server maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Important
Duende Software vereist mogelijk dat u een licentiekosten betaalt voor productiegebruik van Duende Identity Server. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.
Zie de documentatie van Duende Server (Duende Identity Software-website) voor meer informatie.
Bekijk of download de voorbeeldcode (downloaden).
Een web-app maken met verificatie
Maak een ASP.NET Core Web Application-project met afzonderlijke gebruikersaccounts.
- Selecteer de ASP.NET Core Web App-sjabloon . Geef het project de naam WebApp1 om dezelfde naamruimte te hebben als het gedownloade project. Klik op OK.
- Selecteer afzonderlijke gebruikersaccounts in de invoer van het verificatietype.
Het gegenereerde project biedt ASP.NET Core Identity als eenRazor klassebibliotheek. De IdentityRazor classbibliotheek biedt toegang tot eindpunten binnen het Identity gebied. Voorbeeld:
- /Identity/Account/Aanmelding
- /Identity/Account/afmelding
- /Identity/Account/Beheren
Voer migraties uit
Pas de migraties toe voor het initialiseren van de database.
Voer de volgende opdracht uit in de Package Manager Console (PMC):
Update-Database
Registratie en inloggen testen
Voer de app uit en registreer een gebruiker. Afhankelijk van de schermgrootte moet u mogelijk de wisselknop voor navigatie selecteren om de koppelingen registreren en aanmelden weer te geven.
De Identity-database weergeven
- Selecteer in het menu Beeldde optie SQL Server Object Explorer (SSOX).
- Navigeer naar (localdb)MSSQLLocalDB(SQL Server 13). Klik met de rechtermuisknop op dbo.AspNetUsers>Gegevens weergeven:
Diensten van Identity configureren
Services worden toegevoegd in Program.cs. Het gebruikelijke patroon is het aanroepen van methoden in de volgende volgorde:
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();
De voorgaande code configureert Identity met standaardoptiewaarden. Services worden beschikbaar gesteld voor de app via afhankelijkheidsinjectie.
Identity is ingeschakeld door UseAuthenticationaan te roepen.
UseAuthentication voegt verificatie-middleware toe aan de aanvraagpijplijn.
De door de sjabloon gegenereerde app maakt geen gebruik van autorisatie.
app.UseAuthorization is opgenomen om ervoor te zorgen dat deze in de juiste volgorde wordt toegevoegd als de app autorisatie toevoegt.
UseRouting, UseAuthenticationen UseAuthorization moeten worden aangeroepen in de volgorde die in de voorgaande code wordt weergegeven.
Zie IdentityOptions en IdentityOptionsvoor meer informatie over .
Scaffold Registreren, Inloggen, Uitloggen en Registratiebevestiging
Voeg de bestanden Register, Login, LogOuten RegisterConfirmation toe. Volg de scaffold-identiteit in een Razor project met autorisatie-instructies voor het genereren van de code die in deze sectie wordt weergegeven.
Register onderzoeken
Wanneer een gebruiker op de knop Registreren op de Register pagina klikt, wordt de RegisterModel.OnPostAsync actie aangeroepen. De gebruiker wordt gemaakt door CreateAsync(TUser) op het _userManager-object:
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();
}
Standaardaccountverificatie uitschakelen
Met de standaardsjablonen wordt de gebruiker omgeleid naar de Account.RegisterConfirmation waar ze een koppeling kunnen selecteren om het account te laten bevestigen. De standaardwaarde Account.RegisterConfirmation wordt alleen gebruikt voor testen. Automatische accountverificatie moet worden uitgeschakeld in een productie-app.
Als u een bevestigd account wilt vereisen en onmiddellijke aanmelding bij de registratie wilt voorkomen, stelt u DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.csin:
[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();
}
}
Aanmelden
Het aanmeldingsformulier wordt weergegeven wanneer:
- De koppeling Aanmelden is geselecteerd.
- Een gebruiker probeert toegang te krijgen tot een beperkte pagina waarvoor hij geen toestemming heeft of wanneer hij niet door het systeem is geverifieerd.
Wanneer het formulier op de aanmeldingspagina wordt verzonden, wordt de actie OnPostAsync aangeroepen.
PasswordSignInAsync wordt aangeroepen op het _signInManager-object.
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();
}
Zie Inleiding tot autorisatie in ASP.NET Core voor meer informatie over het nemen van autorisatiebeslissingen.
Uitloggen
De koppeling Afmelden roept de LogoutModel.OnPost actie aan.
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();
}
}
}
}
In de voorgaande code moet de code return RedirectToPage(); een omleiding zijn, zodat de browser een nieuwe aanvraag uitvoert en de identiteit voor de gebruiker wordt bijgewerkt.
SignOutAsync wist de claims van de gebruiker die zijn opgeslagen in een cookie.
De post is gespecificeerd in de Pages/Shared/_LoginPartial.cshtml:
@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>
Test Identity
Met de standaardwebprojectsjablonen is anonieme toegang tot de startpagina's toegestaan. Als u Identitywilt testen, voegt u [Authorize]toe:
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()
{
}
}
}
Als u bent aangemeld, meldt u zich af. Voer de app uit en selecteer de koppeling Privacy. U wordt omgeleid naar de aanmeldingspagina.
Verken Identity
Meer informatie over Identity:
- Gebruikersinterfacebron voor volledige identiteit maken
- Bekijk de bron van elke pagina en doorloop het foutopsporingsprogramma.
Identity onderdelen
IdentityAlle -afhankelijke NuGet-pakketten zijn opgenomen in het gedeelde ASP.NET Core-framework.
Het primaire pakket is IdentityMicrosoft.AspNetCore.Identity. Dit pakket bevat de kernset interfaces voor ASP.NET Core Identityen is opgenomen in Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Migreren naar ASP.NET Core-Identity
Zie Identity voor meer informatie en richtlijnen over het migreren van uw bestaande Identity store.
Wachtwoordsterkte instellen
Zie Configuratie voor een voorbeeld waarmee de minimale wachtwoordvereisten worden ingesteld.
AddDefaultIdentity en AddIdentity
AddDefaultIdentity werd geïntroduceerd in ASP.NET Core 2.1. Bellen AddDefaultIdentity is vergelijkbaar met het aanroepen van het volgende:
Zie AddDefaultIdentity-bron voor meer informatie.
Publicatie van statische Identity assets voorkomen
Om te voorkomen dat statische Identity assets (opmaakmodellen en JavaScript-bestanden voor Identity gebruikersinterface) naar de webroot worden gepubliceerd, voeg de volgende ResolveStaticWebAssetsInputsDependsOn eigenschap en RemoveIdentityAssets doel toe aan het projectbestand van de app:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Volgende stappen
- Zie dit GitHub-probleem voor informatie over het Identity configureren met SQLite.
- Configureren Identity
- Een ASP.NET Core-app maken met gebruikersgegevens die worden beveiligd door autorisatie
- Gebruikersgegevens Identity toevoegen, downloaden en verwijderen in een ASP.NET Core-project
- Het genereren van QR-code inschakelen voor TOTP Authenticator-apps in ASP.NET Core
- Verificatie migreren en Identity naar ASP.NET Core
- Accountbevestiging en wachtwoordherstel in ASP.NET Core
- Tweeledige verificatie met SMS in ASP.NET Core
- Host ASP.NET Core in een webfarm
Door Rick Anderson
ASP.NET Core-Identity:
- Is een API die aanmeldingsfunctionaliteit van de gebruikersinterface (UI) ondersteunt.
- Beheert gebruikers, wachtwoorden, profielgegevens, rollen, claims, tokens, e-mailbevestiging en meer.
Gebruikers kunnen een account maken met de aanmeldingsgegevens die zijn opgeslagen in Identity of ze kunnen een externe aanmeldingsprovider gebruiken. Ondersteunde externe aanmeldingsproviders zijn Facebook, Google, Microsoft-account en Twitter.
Zie Geverifieerde gebruikers vereisen voor informatie over het globaal vereisen dat alle gebruikers worden geverifieerd.
De Identity broncode is beschikbaar op GitHub. Scaffold Identity en bekijk de gegenereerde bestanden om de interactie met de sjabloon Identity te controleren.
Identity wordt doorgaans geconfigureerd met behulp van een SQL Server-database voor het opslaan van gebruikersnamen, wachtwoorden en profielgegevens. U kunt ook een ander permanent archief gebruiken, bijvoorbeeld Azure Table Storage.
In dit onderwerp leert u hoe u Identity kunt gebruiken om een gebruiker te registreren, aan te melden en af te melden. Opmerking: de sjablonen behandelen gebruikersnaam en e-mail als dezelfde voor gebruikers. Zie Identityvoor meer gedetailleerde instructies over het maken van apps die gebruikmaken van .
Microsoft Identity Platform is:
- Een evolutie van het Azure Ad-ontwikkelaarsplatform (Azure Active Directory).
- Een alternatieve identiteitsoplossing voor verificatie en autorisatie in ASP.NET Core-apps.
- Niet gerelateerd aan ASP.NET Core Identity.
ASP.NET Core Identity voegt de aanmeldingsfunctionaliteit van de gebruikersinterface (UI) toe aan ASP.NET Core-web-apps. Gebruik een van de volgende manieren om web-API's en SPA's te beveiligen:
- Microsoft Entra-id
- Azure Active Directory B2C (Azure AD B2C)
- Duende IdentityServer. Duende IdentityServer is een product van derden.
Duende IdentityServer is een OpenID Connect- en OAuth 2.0-framework voor ASP.NET Core. Duende IdentityServer maakt de volgende beveiligingsfuncties mogelijk:
- Verificatie als een service (AaaS)
- Eenmalige aanmelding/uit (SSO) voor meerdere toepassingstypen
- Toegangsbeheer voor API's
- Federatie-gateway
Zie Overzicht van Duende IdentityServer voor meer informatie.
Raadpleeg Community OSS-verificatieopties voor ASP.NET Core voor meer informatie over andere verificatieproviders
Bekijk of download de voorbeeldcode (downloaden).
Een web-app maken met verificatie
Maak een ASP.NET Core Web Application-project met afzonderlijke gebruikersaccounts.
- Selecteer Bestand>Nieuw>Project.
- Selecteer ASP.NET Core-webapplicatie. Geef het project de naam WebApp1 om dezelfde naamruimte te hebben als het gedownloade project. Klik op OK.
- Selecteer een ASP.NET Core-webtoepassing en selecteer Vervolgens Verificatie wijzigen.
- Selecteer afzonderlijke gebruikersaccounts en klik op OK.
Het gegenereerde project biedt ASP.NET Core Identity als eenRazor klassebibliotheek. De IdentityRazor classbibliotheek biedt toegang tot eindpunten binnen het Identity gebied. Voorbeeld:
- /Identity/Account/Aanmelding
- /Identity/Account/afmelding
- /Identity/Account/Beheren
Voer migraties uit
Pas de migraties toe voor het initialiseren van de database.
Voer de volgende opdracht uit in de Package Manager Console (PMC):
PM> Update-Database
Registratie en inloggen testen
Voer de app uit en registreer een gebruiker. Afhankelijk van de schermgrootte moet u mogelijk de wisselknop voor navigatie selecteren om de koppelingen registreren en aanmelden weer te geven.
De Identity-database weergeven
- Selecteer in het menu Beeldde optie SQL Server Object Explorer (SSOX).
- Navigeer naar (localdb)MSSQLLocalDB(SQL Server 13). Klik met de rechtermuisknop op dbo.AspNetUsers>Gegevens weergeven:
Diensten van Identity configureren
Services worden toegevoegd in ConfigureServices. Het typische patroon is om alle Add{Service} methoden aan te roepen en vervolgens alle services.Configure{Service} methoden aan te roepen.
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;
});
}
De voorgaande gemarkeerde code configureert Identity met standaardoptiewaarden. Services worden beschikbaar gesteld voor de app via afhankelijkheidsinjectie.
Identity is ingeschakeld door UseAuthenticationaan te roepen.
UseAuthentication voegt verificatie-middleware toe aan de aanvraagpijplijn.
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;
});
}
De voorgaande code configureert Identity met standaardoptiewaarden. Services worden beschikbaar gesteld voor de app via afhankelijkheidsinjectie.
Identity is ingeschakeld door UseAuthenticationaan te roepen.
UseAuthentication voegt verificatie-middleware toe aan de aanvraagpijplijn.
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();
});
}
De door de sjabloon gegenereerde app maakt geen gebruik van autorisatie.
app.UseAuthorization is opgenomen om ervoor te zorgen dat deze in de juiste volgorde wordt toegevoegd als de app autorisatie toevoegt.
UseRouting, UseAuthentication, UseAuthorizationen UseEndpoints moeten worden aangeroepen in de volgorde die in de voorgaande code wordt weergegeven.
Zie IdentityOptions en Startupvoor meer informatie over IdentityOptions en .
Scaffold Registreren, Inloggen, Uitloggen en Registratiebevestiging
Voeg de bestanden Register, Login, LogOuten RegisterConfirmation toe. Volg de scaffold-identiteit in een Razor project met autorisatie-instructies voor het genereren van de code die in deze sectie wordt weergegeven.
Register onderzoeken
Wanneer een gebruiker op de knop Registreren op de Register pagina klikt, wordt de RegisterModel.OnPostAsync actie aangeroepen. De gebruiker wordt gemaakt door CreateAsync(TUser) op het _userManager-object:
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();
}
Standaardaccountverificatie uitschakelen
Met de standaardsjablonen wordt de gebruiker omgeleid naar de Account.RegisterConfirmation waar ze een koppeling kunnen selecteren om het account te laten bevestigen. De standaardwaarde Account.RegisterConfirmation wordt alleen gebruikt voor testen. Automatische accountverificatie moet worden uitgeschakeld in een productie-app.
Als u een bevestigd account wilt vereisen en onmiddellijke aanmelding bij de registratie wilt voorkomen, stelt u DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.csin:
[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();
}
}
Aanmelden
Het aanmeldingsformulier wordt weergegeven wanneer:
- De koppeling Aanmelden is geselecteerd.
- Een gebruiker probeert toegang te krijgen tot een beperkte pagina waarvoor hij geen toestemming heeft of wanneer hij niet door het systeem is geverifieerd.
Wanneer het formulier op de aanmeldingspagina wordt verzonden, wordt de actie OnPostAsync aangeroepen.
PasswordSignInAsync wordt aangeroepen op het _signInManager-object.
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();
}
Zie Inleiding tot autorisatie in ASP.NET Core voor meer informatie over het nemen van autorisatiebeslissingen.
Uitloggen
De koppeling Afmelden roept de LogoutModel.OnPost actie aan.
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();
}
}
}
}
In de voorgaande code moet de code return RedirectToPage(); een omleiding zijn, zodat de browser een nieuwe aanvraag uitvoert en de identiteit voor de gebruiker wordt bijgewerkt.
SignOutAsync wist de claims van de gebruiker die zijn opgeslagen in een cookie.
De post is gespecificeerd in de Pages/Shared/_LoginPartial.cshtml:
@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>
Test Identity
Met de standaardwebprojectsjablonen is anonieme toegang tot de startpagina's toegestaan. Als u Identitywilt testen, voegt u [Authorize]toe:
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()
{
}
}
}
Als u bent aangemeld, meldt u zich af. Voer de app uit en selecteer de koppeling Privacy. U wordt omgeleid naar de aanmeldingspagina.
Verken Identity
Meer informatie over Identity:
- Gebruikersinterfacebron voor volledige identiteit maken
- Bekijk de bron van elke pagina en doorloop het foutopsporingsprogramma.
Identity onderdelen
IdentityAlle -afhankelijke NuGet-pakketten zijn opgenomen in het gedeelde ASP.NET Core-framework.
Het primaire pakket is IdentityMicrosoft.AspNetCore.Identity. Dit pakket bevat de kernset interfaces voor ASP.NET Core Identityen is opgenomen in Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Migreren naar ASP.NET Core-Identity
Zie Identity voor meer informatie en richtlijnen over het migreren van uw bestaande Identity store.
Wachtwoordsterkte instellen
Zie Configuratie voor een voorbeeld waarmee de minimale wachtwoordvereisten worden ingesteld.
Publicatie van statische Identity assets voorkomen
Om te voorkomen dat statische Identity assets (opmaakmodellen en JavaScript-bestanden voor Identity gebruikersinterface) naar de webroot worden gepubliceerd, voeg de volgende ResolveStaticWebAssetsInputsDependsOn eigenschap en RemoveIdentityAssets doel toe aan het projectbestand van de app:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Volgende stappen
- ASP.NET Core-broncode Identity
- AddDefaultIdentity-bron
- Zie dit GitHub-probleem voor informatie over het Identity configureren met SQLite.
- Configureren Identity
- Een ASP.NET Core-app maken met gebruikersgegevens die worden beveiligd door autorisatie
- Gebruikersgegevens Identity toevoegen, downloaden en verwijderen in een ASP.NET Core-project
- Het genereren van QR-code inschakelen voor TOTP Authenticator-apps in ASP.NET Core
- Verificatie migreren en Identity naar ASP.NET Core
- Accountbevestiging en wachtwoordherstel in ASP.NET Core
- Tweeledige verificatie met SMS in ASP.NET Core
- Host ASP.NET Core in een webfarm