ASP.NET Core'a Identity giriş
Gönderen Rick Anderson
ASP.NET Core Identity:
- Kullanıcı arabirimi (UI) oturum açma işlevini destekleyen bir API'dir.
- Kullanıcıları, parolaları, profil verilerini, rolleri, talepleri, belirteçleri, e-posta onaylarını ve daha fazlasını yönetir.
Kullanıcılar, içinde Identity depolanan oturum açma bilgileriyle bir hesap oluşturabilir veya bir dış oturum açma sağlayıcısı kullanabilir. Desteklenen dış oturum açma sağlayıcıları Facebook, Google, Microsoft Hesabı ve Twitter'dır.
Genel olarak tüm kullanıcıların kimliğinin doğrulanmış olmasını gerektirme hakkında bilgi için bkz . Kimliği doğrulanmış kullanıcılar gerektirme.
Identity Kaynak kodu GitHub'da kullanılabilir. Identity ile Identityşablon etkileşimini gözden geçirmek için iskele oluşturun ve oluşturulan dosyaları görüntüleyin.
Identity genellikle kullanıcı adlarını, parolaları ve profil verilerini depolamak için bir SQL Server veritabanı kullanılarak yapılandırılır. Alternatif olarak, azure tablo depolama gibi başka bir kalıcı depo kullanılabilir.
Bu konuda, bir kullanıcıyı kaydetmek, oturum açmak ve oturumu açmak için kullanmayı Identity öğreneceksiniz. Not: Şablonlar kullanıcı adı ve e-postayı kullanıcılar için aynı şekilde ele alır. kullanan Identityuygulamalar oluşturma hakkında daha ayrıntılı yönergeler için bkz . Sonraki Adımlar.
ASP.NET CoreIdentity, Microsoft identity platformuyla ilgili değildir. Microsoft identity platformu şu şekildedir:
- Azure Active Directory (Azure AD) geliştirici platformunun gelişimi.
- ASP.NET Core uygulamalarında kimlik doğrulaması ve yetkilendirme için alternatif identity bir çözüm.
ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende Identity Sunucusu
Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende Identity Sunucusu aşağıdaki güvenlik özelliklerini etkinleştirir:
- Hizmet Olarak Kimlik Doğrulaması (AaaS)
- Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
- API'ler için erişim denetimi
- Federasyon Ağ Geçidi
Önemli
Duende Yazılımı, Duende Identity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için, bkz. ASP.NET Core 5.0'den 6.0'a geçiş.
Daha fazla bilgi için Duende Server belgelerine (Duende Yazılım web sitesi) bakın.Identity
Örnek kodu görüntüleyin veya indirin (nasıl indirilir).
Kimlik doğrulaması ile Web uygulaması oluşturma
Tek Tek Kullanıcı Hesaplarıyla ASP.NET Core Web Uygulaması projesi oluşturun.
- ASP.NET Core Web Uygulaması şablonunu seçin. Proje indirme işlemiyle aynı ad alanına sahip olması için projeyi WebApp1 olarak adlandırın. Tamam'a tıklayın.
- Kimlik doğrulaması türü girişinde Bireysel Kullanıcı Hesapları’nı seçin.
Oluşturulan proje, sınıf kitaplığı olarak ASP.NET Core Identity sağlar.Razor IdentityRazor Sınıf kitaplığı, alanıyla uç Identity
noktaları kullanıma sunar. Örneğin:
- /Identity/Account/Login
- /Identity/Account/Logout
- /Identity/Hesap/Yönet
Geçişleri uygulama
Veritabanını başlatmak için geçişleri uygulayın.
Paket Yöneticisi Konsolu'nda (PMC) aşağıdaki komutu çalıştırın:
Update-Database
Test Kaydı ve Oturum Açma
Uygulamayı çalıştırın ve bir kullanıcı kaydedin. Ekran boyutunuz bağlı olarak, Kaydet ve Oturum Aç bağlantılarını görmek için gezinti iki durumlu düğmesini seçmeniz gerekebilir.
Identity Veritabanını görüntüleme
- Görünüm menüsünde SQL Server Nesne Gezgini (SSOX) öğesini seçin.
- (localdb)MSSQLLocalDB(SQL Server 13)'e gidin. Dbo'ya sağ tıklayın. AspNetUsers>Görünüm Verileri:
Hizmetleri yapılandırma Identity
Hizmetler'e Program.cs
eklenir. Tipik desen, yöntemleri aşağıdaki sırayla çağırmaktır:
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();
Yukarıdaki kod varsayılan seçenek değerleriyle yapılandırılır Identity . Hizmetler, bağımlılık ekleme yoluyla uygulamanın kullanımına sunulur.
Identity çağrısıyla UseAuthenticationetkinleştirilir. UseAuthentication
, istek işlem hattına kimlik doğrulama ara yazılımı ekler.
Şablon tarafından oluşturulan uygulama yetkilendirme kullanmaz. app.UseAuthorization
uygulamanın yetkilendirme eklemesi halinde doğru sırada eklendiğinden emin olmak için dahil edilir. UseRouting
, UseAuthentication
ve UseAuthorization
önceki kodda gösterilen sırayla çağrılmalıdır.
hakkında IdentityOptions
daha fazla bilgi için bkz IdentityOptions . ve Uygulama Başlatma.
yapı iskelesi yazma, oturum açma, logout ve registerconfirmation
Register
, Login
, LogOut
ve RegisterConfirmation
dosyalarını ekleyin. identity Bu bölümde gösterilen kodu oluşturmak için yetkilendirme yönergeleriyle birlikte bir Razor projenin iskelesini izleyin.
Yazmaç'ı inceleyin
Kullanıcı sayfadaki Kaydet düğmesine Register
tıkladığında, RegisterModel.OnPostAsync
eylem çağrılır. Kullanıcı nesnesinde _userManager
tarafından CreateAsync(TUser) oluşturulur:
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();
}
Varsayılan hesap doğrulamayı devre dışı bırakma
Varsayılan şablonlarla, kullanıcı hesabın Account.RegisterConfirmation
onaylanması için bir bağlantı seçebileceği konuma yönlendirilir. Varsayılan değer Account.RegisterConfirmation
yalnızca test için kullanılır, üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.
Onaylanan bir hesap gerektirmek ve kayıt sırasında hemen oturum açmayı önlemek için içinde /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs
ayarlayınDisplayConfirmAccountLink = false
:
[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();
}
}
Oturum açma
Oturum açma formu şu durumlarda görüntülenir:
- Oturum aç bağlantısı seçilidir.
- Kullanıcı, erişim yetkisi olmayan veya sistem tarafından kimlik doğrulaması yapılmamış kısıtlı bir sayfaya erişmeye çalışır.
Oturum Açma sayfasındaki form gönderildiğinde, OnPostAsync
eylem çağrılır. PasswordSignInAsync
nesnesinde çağrılır _signInManager
.
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();
}
Yetkilendirme kararları verme hakkında bilgi için bkz . ASP.NET Core'da yetkilendirmeye giriş.
Oturumu kapat
Oturumu kapat bağlantısı eylemi çağırırLogoutModel.OnPost
.
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();
}
}
}
}
Yukarıdaki kodda, tarayıcının yeni bir istek gerçekleştirmesi ve identity kullanıcının güncelleştirilmesi için kodun return RedirectToPage();
yeniden yönlendirme olması gerekir.
SignOutAsync kullanıcının içinde cookiedepolanan taleplerini temizler.
Gönderi, içinde Pages/Shared/_LoginPartial.cshtml
belirtilir:
@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
Varsayılan web projesi şablonları sayfalara anonim erişim sağlar home . test Identityetmek için ekleyin [Authorize]
:
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()
{
}
}
}
Oturum açtıysanız oturumu kapatın. Uygulamayı çalıştırın ve bağlantıyı seçin Privacy . Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin: Identity
Daha ayrıntılı incelemek Identity için:
- Tam identity kullanıcı arabirimi kaynağı oluşturma
- Her sayfanın kaynağını inceleyin ve hata ayıklayıcıda ilerleyin.
Identity Bileşen
IdentityTüm bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçevesine dahil edilir.
için Identity birincil paket Microsoft.AspNetCore.Identity. Bu paket, ASP.NET Core Identityiçin çekirdek arabirim kümesini içerir ve tarafından Microsoft.AspNetCore.Identity.EntityFrameworkCore
dahil edilir.
ASP.NET Core'a geçiş Identity
Mevcut Identity deponuzu geçirme hakkında daha fazla bilgi ve kılavuz için bkz . Kimlik Doğrulamasını Geçirme ve Identity.
Parola gücünü ayarlama
En düşük parola gereksinimlerini ayarlayan bir örnek için yapılandırma bölümüne bakın.
AddDefaultIdentity ve AddIdentity
AddDefaultIdentity ASP.NET Core 2.1'de tanıtıldı. Çağırma AddDefaultIdentity
, aşağıdakileri çağırmaya benzer:
Daha fazla bilgi için bkz . AddDefaultIdentity kaynağı .
Statik Identity varlıkların yayımlanmasını engelleme
Web kökünde statik Identity varlıkların (kullanıcı arabirimi için stil sayfaları ve JavaScript dosyaları) yayımlanmasını önlemek için Identity aşağıdaki ResolveStaticWebAssetsInputsDependsOn
özelliği ekleyin ve RemoveIdentityAssets
uygulamanın proje dosyasına hedefleyin:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Sonraki Adımlar
- SQLite kullanarak yapılandırma Identity hakkında bilgi için bu GitHub sorununa bakın.
- Yapılandırmak Identity
- Kullanıcı verilerinin yetkilendirme tarafından korunduğu bir ASP.NET Core uygulaması oluşturma
- ASP.NET Core projesinde kullanıcı verilerini Identity ekleme, indirme ve silme
- ASP.NET Core'da TOTP kimlik doğrulayıcı uygulamaları için QR kodu oluşturmayı etkinleştirme
- Kimlik Doğrulamasını ve Identity ASP.NET Core'a Geçirme
- ASP.NET Core'da hesap onayı ve parola kurtarma
- ASP.NET Core'da SMS ile iki öğeli kimlik doğrulaması
- Web grubunda ASP.NET Core barındırma
Gönderen Rick Anderson
ASP.NET Core Identity:
- Kullanıcı arabirimi (UI) oturum açma işlevini destekleyen bir API'dir.
- Kullanıcıları, parolaları, profil verilerini, rolleri, talepleri, belirteçleri, e-posta onaylarını ve daha fazlasını yönetir.
Kullanıcılar, içinde Identity depolanan oturum açma bilgileriyle bir hesap oluşturabilir veya bir dış oturum açma sağlayıcısı kullanabilir. Desteklenen dış oturum açma sağlayıcıları Facebook, Google, Microsoft Hesabı ve Twitter'dır.
Genel olarak tüm kullanıcıların kimliğinin doğrulanmış olmasını gerektirme hakkında bilgi için bkz . Kimliği doğrulanmış kullanıcılar gerektirme.
Identity Kaynak kodu GitHub'da kullanılabilir. Identity ile Identityşablon etkileşimini gözden geçirmek için iskele oluşturun ve oluşturulan dosyaları görüntüleyin.
Identity genellikle kullanıcı adlarını, parolaları ve profil verilerini depolamak için bir SQL Server veritabanı kullanılarak yapılandırılır. Alternatif olarak, azure tablo depolama gibi başka bir kalıcı depo kullanılabilir.
Bu konuda, bir kullanıcıyı kaydetmek, oturum açmak ve oturumu açmak için kullanmayı Identity öğreneceksiniz. Not: Şablonlar kullanıcı adı ve e-postayı kullanıcılar için aynı şekilde ele alır. kullanan Identityuygulamalar oluşturma hakkında daha ayrıntılı yönergeler için bkz . Sonraki Adımlar.
Microsoft identity platformu şu şekildedir:
- Azure Active Directory (Azure AD) geliştirici platformunun gelişimi.
- ASP.NET Core uygulamalarında kimlik doğrulaması ve yetkilendirme için alternatif identity bir çözüm.
- ASP.NET Core Identityile ilgili değildir.
ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:
- Microsoft Entra ID
- Azure Active Directory B2C (Azure AD B2C)
- Duende IdentityServer. Duende IdentityServer üçüncü taraf üründür.
Duende IdentityServer, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende IdentityServer aşağıdaki güvenlik özelliklerini etkinleştirir:
- Hizmet Olarak Kimlik Doğrulaması (AaaS)
- Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
- API'ler için erişim denetimi
- Federasyon Ağ Geçidi
Daha fazla bilgi için bkz . Duende IdentityServer'a Genel Bakış.
Diğer kimlik doğrulama sağlayıcıları hakkında daha fazla bilgi için bkz . ASP.NET Core için Topluluk İşletim Sistemi kimlik doğrulama seçenekleri
Örnek kodu görüntüleyin veya indirin (nasıl indirilir).
Kimlik doğrulaması ile Web uygulaması oluşturma
Tek Tek Kullanıcı Hesaplarıyla ASP.NET Core Web Uygulaması projesi oluşturun.
- Dosya>Yeni>Proje’yi seçin.
- ASP.NET Çekirdek Web Uygulaması'nı seçin. Proje indirme işlemiyle aynı ad alanına sahip olması için projeyi WebApp1 olarak adlandırın. Tamam'a tıklayın.
- bir ASP.NET Core Web Uygulaması seçin ve ardından Kimlik Doğrulamasını Değiştir'i seçin.
- Bireysel Kullanıcı Hesapları'nı seçin ve Tamam'a tıklayın.
Oluşturulan proje, sınıf kitaplığı olarak ASP.NET Core Identity sağlar.Razor IdentityRazor Sınıf kitaplığı, alanıyla uç Identity
noktaları kullanıma sunar. Örneğin:
- /Identity/Account/Login
- /Identity/Account/Logout
- /Identity/Hesap/Yönet
Geçişleri uygulama
Veritabanını başlatmak için geçişleri uygulayın.
Paket Yöneticisi Konsolu'nda (PMC) aşağıdaki komutu çalıştırın:
PM> Update-Database
Test Kaydı ve Oturum Açma
Uygulamayı çalıştırın ve bir kullanıcı kaydedin. Ekran boyutunuz bağlı olarak, Kaydet ve Oturum Aç bağlantılarını görmek için gezinti iki durumlu düğmesini seçmeniz gerekebilir.
Identity Veritabanını görüntüleme
- Görünüm menüsünde SQL Server Nesne Gezgini (SSOX) öğesini seçin.
- (localdb)MSSQLLocalDB(SQL Server 13)'e gidin. Dbo'ya sağ tıklayın. AspNetUsers>Görünüm Verileri:
Hizmetleri yapılandırma Identity
Hizmetler'e ConfigureServices
eklenir. Tipik desen, tüm yöntemleri çağırmak Add{Service}
ve ardından tüm yöntemleri çağırmaktır services.Configure{Service}
.
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;
});
}
Yukarıdaki vurgulanan kod varsayılan seçenek değerleriyle yapılandırılır Identity . Hizmetler, bağımlılık ekleme yoluyla uygulamanın kullanımına sunulur.
Identity çağrısıyla UseAuthenticationetkinleştirilir. UseAuthentication
, istek işlem hattına kimlik doğrulama ara yazılımı ekler.
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;
});
}
Yukarıdaki kod varsayılan seçenek değerleriyle yapılandırılır Identity . Hizmetler, bağımlılık ekleme yoluyla uygulamanın kullanımına sunulur.
Identity çağrısıyla UseAuthenticationetkinleştirilir. UseAuthentication
, istek işlem hattına kimlik doğrulama ara yazılımı ekler.
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();
});
}
Şablon tarafından oluşturulan uygulama yetkilendirme kullanmaz. app.UseAuthorization
uygulamanın yetkilendirme eklemesi halinde doğru sırada eklendiğinden emin olmak için dahil edilir. UseRouting
, UseAuthentication
, UseAuthorization
ve UseEndpoints
önceki kodda gösterilen sırayla çağrılmalıdır.
ve hakkında IdentityOptions
daha fazla bilgi için bkzIdentityOptions. ve Uygulama BaşlatmaStartup
.
yapı iskelesi yazma, oturum açma, logout ve registerconfirmation
Register
, Login
, LogOut
ve RegisterConfirmation
dosyalarını ekleyin. identity Bu bölümde gösterilen kodu oluşturmak için yetkilendirme yönergeleriyle birlikte bir Razor projenin iskelesini izleyin.
Yazmaç'ı inceleyin
Kullanıcı sayfadaki Kaydet düğmesine Register
tıkladığında, RegisterModel.OnPostAsync
eylem çağrılır. Kullanıcı nesnesinde _userManager
tarafından CreateAsync(TUser) oluşturulur:
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();
}
Varsayılan hesap doğrulamayı devre dışı bırakma
Varsayılan şablonlarla, kullanıcı hesabın Account.RegisterConfirmation
onaylanması için bir bağlantı seçebileceği konuma yönlendirilir. Varsayılan değer Account.RegisterConfirmation
yalnızca test için kullanılır, üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.
Onaylanan bir hesap gerektirmek ve kayıt sırasında hemen oturum açmayı önlemek için içinde /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs
ayarlayınDisplayConfirmAccountLink = false
:
[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();
}
}
Oturum açma
Oturum açma formu şu durumlarda görüntülenir:
- Oturum aç bağlantısı seçilidir.
- Kullanıcı, erişim yetkisi olmayan veya sistem tarafından kimlik doğrulaması yapılmamış kısıtlı bir sayfaya erişmeye çalışır.
Oturum Açma sayfasındaki form gönderildiğinde, OnPostAsync
eylem çağrılır. PasswordSignInAsync
nesnesinde çağrılır _signInManager
.
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();
}
Yetkilendirme kararları verme hakkında bilgi için bkz . ASP.NET Core'da yetkilendirmeye giriş.
Oturumu kapat
Oturumu kapat bağlantısı eylemi çağırırLogoutModel.OnPost
.
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();
}
}
}
}
Yukarıdaki kodda, tarayıcının yeni bir istek gerçekleştirmesi ve identity kullanıcının güncelleştirilmesi için kodun return RedirectToPage();
yeniden yönlendirme olması gerekir.
SignOutAsync kullanıcının içinde cookiedepolanan taleplerini temizler.
Gönderi, içinde Pages/Shared/_LoginPartial.cshtml
belirtilir:
@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
Varsayılan web projesi şablonları sayfalara anonim erişim sağlar home . test Identityetmek için ekleyin [Authorize]
:
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()
{
}
}
}
Oturum açtıysanız oturumu kapatın. Uygulamayı çalıştırın ve bağlantıyı seçin Privacy . Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin: Identity
Daha ayrıntılı incelemek Identity için:
- Tam identity kullanıcı arabirimi kaynağı oluşturma
- Her sayfanın kaynağını inceleyin ve hata ayıklayıcıda ilerleyin.
Identity Bileşen
IdentityTüm bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçevesine dahil edilir.
için Identity birincil paket Microsoft.AspNetCore.Identity. Bu paket, ASP.NET Core Identityiçin çekirdek arabirim kümesini içerir ve tarafından Microsoft.AspNetCore.Identity.EntityFrameworkCore
dahil edilir.
ASP.NET Core'a geçiş Identity
Mevcut Identity deponuzu geçirme hakkında daha fazla bilgi ve kılavuz için bkz . Kimlik Doğrulamasını Geçirme ve Identity.
Parola gücünü ayarlama
En düşük parola gereksinimlerini ayarlayan bir örnek için yapılandırma bölümüne bakın.
Statik Identity varlıkların yayımlanmasını engelleme
Web kökünde statik Identity varlıkların (kullanıcı arabirimi için stil sayfaları ve JavaScript dosyaları) yayımlanmasını önlemek için Identity aşağıdaki ResolveStaticWebAssetsInputsDependsOn
özelliği ekleyin ve RemoveIdentityAssets
uygulamanın proje dosyasına hedefleyin:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Sonraki Adımlar
- ASP.NET Çekirdek Identity kaynak kodu
- AddDefaultIdentity kaynağı
- SQLite kullanarak yapılandırma Identity hakkında bilgi için bu GitHub sorununa bakın.
- Yapılandırmak Identity
- Kullanıcı verilerinin yetkilendirme tarafından korunduğu bir ASP.NET Core uygulaması oluşturma
- ASP.NET Core projesinde kullanıcı verilerini Identity ekleme, indirme ve silme
- ASP.NET Core'da TOTP kimlik doğrulayıcı uygulamaları için QR kodu oluşturmayı etkinleştirme
- Kimlik Doğrulamasını ve Identity ASP.NET Core'a Geçirme
- ASP.NET Core'da hesap onayı ve parola kurtarma
- ASP.NET Core'da SMS ile iki öğeli kimlik doğrulaması
- Web grubunda ASP.NET Core barındırma
ASP.NET Core