Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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. Iskele Identity ile şablon etkileşimini Identitygözden geçirmek için 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, Identity kullanarak bir kullanıcıyı kaydetmeyi, oturum açmayı ve kapatmayı öğ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.
Daha fazla bilgi için Identity uygulamalarında Blazor, ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirmesi ile Blazor belgelerindeki bununla ilgili makalelere bakın.
ASP.NET Core Identity, Microsoft kimlik platformuyla ilgili değildir. Microsoft kimlik 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 bir kimlik çö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 Software, DuendeIdentity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için bkz. .NET 5'te ASP.NET Core'dan .NET 6'ya geçiş.
Daha fazla bilgi için Duende Server belgelerine (Duende Software web sitesi)
Örnek kodu görüntüleyin veya indirin (nasıl indirilir).
Kimlik doğrulaması ile bir Blazor Web App oluşturun
Tek Tek Hesaplar ile bir ASP.NET Core Blazor Web App projesi oluşturun.
Not
Razor Sayfalar deneyimi için Kimlik doğrulaması ile Sayfalar uygulaması oluşturma Razor bölümüne bakın.
MVC deneyimi için Kimlik doğrulaması ile MVC uygulaması oluşturma bölümüne bakın.
- Blazor Web App Şablonu seçin. sonrakiseçin.
- Aşağıdaki seçimleri yapın:
- Kimlik doğrulama türü: Tek Tek Hesaplar
- Etkileşimli işleme modu: Sunucu
- Etkileşim Konumu: Genel
- Oluştur'i seçin.
Oluşturulan proje bileşenleri içerir IdentityRazor . Bileşenler klasöründe bulunur Components/Account
. Örneğin:
/Components/Account/Pages/Register
/Components/Account/Pages/Login
/Components/Account/Pages/Manage/ChangePassword
Identity
Razor bileşenleri, belirli kullanım örnekleri için belgelerde ayrı ayrı açıklanmıştır ve her sürümün değiştirilmesine tabidir. Tek Tek Hesaplar ile bir Blazor Web App oluşturduğunuzda, IdentityRazor bileşenler oluşturulan projeye dahil edilir. Bileşenler IdentityRazor, ASP.NET Core başvuru kaynağındaki (BlazorGitHub deposu) proje şablonunda da incelenebilirdotnet/aspnetcore
.
Not
.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dallar veya etiketler arasında geçiş yap açılır listesini kullanın. Daha fazla bilgi için ASP.NET Core kaynak kodu için bir sürüm etiketi nasıl seçilir (dotnet/AspNetCore.Docs #26205) bölümüne bakın.
Daha fazla bilgi için ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirmesi ile Blazor belgelerde bunu izleyen makalelere bakın. Ana ASP.NET Core belge kümesinin Güvenlik ve Identity alanı makalelerinin çoğu uygulamalar için Blazor geçerlidir. Ancak, Blazor belge kümesi bilgilerin yerini alan veya ekleyen makaleler ve yönergeler içerir. Öncelikle genel ASP.NET Core belgeleri kümesini incelemenizi ve ardından Blazor belgelerdeki makalelere Identity erişmenizi öneririz.
Razor Kimlik doğrulaması ile Sayfalar uygulaması oluşturma
Tek Tek Hesaplarla ASP.NET Core Web Uygulaması (Razor Sayfalar) projesi oluşturun.
- ASP.NET Core Web App (RazorSayfalar) şablonunu seçin. sonrakiseçin.
- Kimlik doğrulama türü içinTek Tek Hesaplar'ı seçin.
- Oluştur'i seçin.
Oluşturulan proje, sınıf kitaplığı (RCL) olarakIdentityASP.NET Core Razor sağlar.
Identity
Razor sınıf kitaplığı, Identity
alanıyla sonlandırıcıları kullanıma sunar. Örneğin:
Areas/Identity/Pages/Account/Register
Areas/Identity/Pages/Account/Login
Areas/Identity/Pages/Account/Manage/ChangePassword
Sayfalar, belirli kullanım örnekleri için belgelerde ayrı ayrı açıklanmıştır ve her sürüm değiştirilebilir. RCL'deki tüm sayfaları görüntülemek için ASP.NET Core başvuru kaynağına (dotnet/aspnetcore
GitHub deposu, Identity/UI/src/Areas/Identity/Pages
klasör) bakın.
Tek tek sayfaları veya tüm sayfaları uygulamaya iskeleleyebilirsiniz. Daha fazla bilgi için bkzIdentity yapı iskelesi.
Kimlik doğrulaması ile MVC uygulaması oluşturma
Tek Tek Hesaplarla ASP.NET Core MVC projesi oluşturun.
- ASP.NET Core Web App (Model-View-Controller) şablonunu seçin. sonrakiseçin.
- Kimlik doğrulama türü içinTek Tek Hesaplar'ı seçin.
- Oluştur'i seçin.
Oluşturulan proje, sınıf kitaplığı (RCL) olarakIdentityASP.NET Core Razor sağlar.
Identity
Razor Sınıf kitaplığı Razor Pages'a dayanır ve Identity
alanı kullanarak uç noktaları sunar. Örneğin:
Areas/Identity/Pages/Account/Register
Areas/Identity/Pages/Account/Login
Areas/Identity/Pages/Account/Manage/ChangePassword
Sayfalar, belirli kullanım örnekleri için belgelerde ayrı ayrı açıklanmıştır ve her sürüm değiştirilebilir. RCL'deki tüm sayfaları görüntülemek için ASP.NET Core başvuru kaynağına (dotnet/aspnetcore
GitHub deposu, Identity/UI/src/Areas/Identity/Pages
klasör) bakın.
Tek tek sayfaları veya tüm sayfaları uygulamaya iskeleleyebilirsiniz. Daha fazla bilgi için bkzIdentity yapı iskelesi.
Geçişleri uygula
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 Kayıt 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:
Identity hizmetlerini yapılandırın
Hizmetler 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 enjeksiyonu 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.
iskele oluşturma, oturum açma, oturum kapatma ve kayıt onayı
Register
, Login
, LogOut
ve RegisterConfirmation
dosyalarını ekleyin. Bu bölümde gösterilen kodu oluşturmak için Razor yönergeleriyle bir projesine bağlayın.
Kayıtları inceleyin
Kullanıcı sayfasındaki KaydolRegister
düğmesine tıklandığında, RegisterModel.OnPostAsync
eylemi çağrılır. Kullanıcı, CreateAsync(TUser) tarafından _userManager
nesnesinde 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 DisplayConfirmAccountLink = false
içinde /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs
ayarlayın.
[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
, _signInManager
nesnesinde çağrılır.
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 kullanıcının kimliğinin güncelleştirilmesi için return RedirectToPage();
kodun yeniden yönlendirme olması gerekir.
SignOutAsync, bir cookie içinde depolanan kullanıcının taleplerini temizler.
Gönderi Pages/Shared/_LoginPartial.cshtml
olarak belirtilmiştir.
@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 Etme Identity
Varsayılan web projesi şablonları, giriş sayfalarına anonim erişime izin verir. Test etmek için Identity ekleyin ve [Authorize]
ile devam edin.
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 Privacy bağlantısını seçin. Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin: Identity
Identity daha ayrıntılı incelemek için:
- Tam kimlik kullanıcı arayüzü kaynağı oluşturma
- Her sayfanın kaynağını inceleyin ve hata ayıklayıcıda adım adım ilerleyin.
Identity Bileşen
IdentityTüm bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçevesine dahil edilir.
Identity için birincil paket Microsoft.AspNetCore.Identity'dir. Bu paket, ASP.NET Core için Identity çekirdek arabirim kümesini içerir ve Microsoft.AspNetCore.Identity.EntityFrameworkCore
tarafından dahil edilmiştir.
ASP.NET Core'a geçiş Identity
Mevcut Identity mağazanızı taşımak hakkında daha fazla bilgi ve kılavuz için bkz: Kimlik Doğrulamasını Taşıma 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 uygulamanın proje dosyasına aşağıdaki Identity özelliği ve ResolveStaticWebAssetsInputsDependsOn
hedefi ekleyin.
<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 Core Blazor kimlik doğrulama ve yetkilendirme
- ASP.NET Çekirdek Identity kaynak kodu
- ASP.NET Core'da Rollerle çalışma Identity
- SQLite kullanarak yapılandırma Identity hakkında bilgi için bkz. SQLite için yapılandırma Identity (
dotnet/AspNetCore.Docs
#5131). - Yapılandırmak Identity
- Yetkilendirmeyle korunan kullanıcı verileriyle 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 çok faktörlü kimlik doğrulaması
- Web grubunda ASP.NET Core barındırma
Tarafından 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. Iskele Identity ile şablon etkileşimini Identitygözden geçirmek için 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, Identity kullanarak bir kullanıcıyı kaydetmeyi, oturum açmayı ve kapatmayı öğ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 Core Identity, Microsoft kimlik platformuyla ilgili değildir. Microsoft kimlik 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 bir kimlik çö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 Software, DuendeIdentity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için bkz. .NET 5'te ASP.NET Core'dan .NET 6'ya geçiş.
Daha fazla bilgi için Duende Server belgelerine (Duende Software web sitesi)
Ö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 App ş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ğrulama türü girişinde Bireysel Kullanıcı Hesapları'nı seçin.
Proje, ASP.NET Core Identity'u sınıf kitaplığı olarakRazor oluşturur.
Identity
Razor sınıf kitaplığı, Identity
alanıyla sonlandırıcıları kullanıma sunar. Örneğin:
- /Identity/Hesap/Giriş
- /Identity/Account/Logout
- /Identity/Hesap/Yönet
Geçişleri uygula
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 Kayıt 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:
Identity hizmetlerini yapılandırın
Hizmetler 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 enjeksiyonu 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.
iskele oluşturma, oturum açma, oturum kapatma ve kayıt onayı
Register
, Login
, LogOut
ve RegisterConfirmation
dosyalarını ekleyin. Bu bölümde gösterilen kodu oluşturmak için Razor yönergeleriyle bir projesine bağlayın.
Kayıtları inceleyin
Kullanıcı sayfasındaki KaydolRegister
düğmesine tıklandığında, RegisterModel.OnPostAsync
eylemi çağrılır. Kullanıcı, CreateAsync(TUser) tarafından _userManager
nesnesinde 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 DisplayConfirmAccountLink = false
içinde /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs
ayarlayın.
[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
, _signInManager
nesnesinde çağrılır.
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 kullanıcının kimliğinin güncelleştirilmesi için return RedirectToPage();
kodun yeniden yönlendirme olması gerekir.
SignOutAsync, bir cookie içinde depolanan kullanıcının taleplerini temizler.
Gönderi Pages/Shared/_LoginPartial.cshtml
olarak belirtilmiştir.
@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 Etme Identity
Varsayılan web projesi şablonları, giriş sayfalarına anonim erişime izin verir. Test etmek için Identity ekleyin ve [Authorize]
ile devam edin.
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 Privacy bağlantısını seçin. Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin: Identity
Identity daha ayrıntılı incelemek için:
- Tam kimlik kullanıcı arayüzü kaynağı oluşturma
- Her sayfanın kaynağını inceleyin ve hata ayıklayıcıda adım adım ilerleyin.
Identity Bileşen
IdentityTüm bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçevesine dahil edilir.
Identity için birincil paket Microsoft.AspNetCore.Identity'dir. Bu paket, ASP.NET Core için Identity çekirdek arabirim kümesini içerir ve Microsoft.AspNetCore.Identity.EntityFrameworkCore
tarafından dahil edilmiştir.
ASP.NET Core'a geçiş Identity
Mevcut Identity mağazanızı taşımak hakkında daha fazla bilgi ve kılavuz için bkz: Kimlik Doğrulamasını Taşıma 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 uygulamanın proje dosyasına aşağıdaki Identity özelliği ve ResolveStaticWebAssetsInputsDependsOn
hedefi ekleyin.
<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 hakkında bilgi için Identity bakın.
- Yapılandırmak Identity
- Yetkilendirmeyle korunan kullanıcı verileriyle 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
Tarafından 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. Iskele Identity ile şablon etkileşimini Identitygözden geçirmek için 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, Identity kullanarak bir kullanıcıyı kaydetmeyi, oturum açmayı ve kapatmayı öğ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 kimlik 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 bir kimlik çö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.
Proje, ASP.NET Core Identity'u sınıf kitaplığı olarakRazor oluşturur.
Identity
Razor sınıf kitaplığı, Identity
alanıyla sonlandırıcıları kullanıma sunar. Örneğin:
- /Identity/Hesap/Giriş
- /Identity/Account/Logout
- /Identity/Hesap/Yönet
Geçişleri uygula
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 Kayıt 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:
Identity hizmetlerini yapılandırın
Hizmetler ConfigureServices
eklenir. Tipik desen, önce tüm Add{Service}
yöntemlerini ve ardından tüm services.Configure{Service}
yöntemlerini çağırmaktır.
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;
});
}
Önceki vurgulanan kod, Identity'yi varsayılan seçenek değerleriyle yapılandırır. Hizmetler bağımlılık enjeksiyonu 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 enjeksiyonu 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.
IdentityOptions
ve Startup
hakkında daha fazla bilgi için IdentityOptions ve Uygulama Başlatma'ya bakın.
iskele oluşturma, oturum açma, oturum kapatma ve kayıt onayı
Register
, Login
, LogOut
ve RegisterConfirmation
dosyalarını ekleyin. Bu bölümde gösterilen kodu oluşturmak için Razor yönergeleriyle bir projesine bağlayın.
Kayıtları inceleyin
Kullanıcı sayfasındaki KaydolRegister
düğmesine tıklandığında, RegisterModel.OnPostAsync
eylemi çağrılır. Kullanıcı, CreateAsync(TUser) tarafından _userManager
nesnesinde 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 DisplayConfirmAccountLink = false
içinde /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs
ayarlayın.
[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
, _signInManager
nesnesinde çağrılır.
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 kullanıcının kimliğinin güncelleştirilmesi için return RedirectToPage();
kodun yeniden yönlendirme olması gerekir.
SignOutAsync, bir cookie içinde depolanan kullanıcının taleplerini temizler.
Gönderi Pages/Shared/_LoginPartial.cshtml
olarak belirtilmiştir.
@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 Etme Identity
Varsayılan web projesi şablonları, giriş sayfalarına anonim erişime izin verir. Test etmek için Identity ekleyin ve [Authorize]
ile devam edin.
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 Privacy bağlantısını seçin. Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin: Identity
Identity daha ayrıntılı incelemek için:
- Tam kimlik kullanıcı arayüzü kaynağı oluşturma
- Her sayfanın kaynağını inceleyin ve hata ayıklayıcıda adım adım ilerleyin.
Identity Bileşen
IdentityTüm bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçevesine dahil edilir.
Identity için birincil paket Microsoft.AspNetCore.Identity'dir. Bu paket, ASP.NET Core için Identity çekirdek arabirim kümesini içerir ve Microsoft.AspNetCore.Identity.EntityFrameworkCore
tarafından dahil edilmiştir.
ASP.NET Core'a geçiş Identity
Mevcut Identity mağazanızı taşımak hakkında daha fazla bilgi ve kılavuz için bkz: Kimlik Doğrulamasını Taşıma 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 uygulamanın proje dosyasına aşağıdaki Identity özelliği ve ResolveStaticWebAssetsInputsDependsOn
hedefi ekleyin.
<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 hakkında bilgi için Identity bakın.
- Yapılandırmak Identity
- Yetkilendirmeyle korunan kullanıcı verileriyle 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