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.
Tüm uygulama kullanıcıları için kimlik doğrulaması gerektirme hakkında bilgi için bkz. Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma.
Identity kaynak kodu GitHub'da mevcut. 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 SQL Server veritabanı kullanılarak yapılandırılır. Alternatif olarak, Azure Tablo Depolaması gibi başka bir kalıcı depolama 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.
Identity uygulamalarında Blazor hakkında daha fazla bilgi için ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirme ve Blazor belgelerindeki makalelere bakın.
ASP.NET Core IdentityMicrosoft kimlik platformu ile ilişkili değildir. Microsoft kimlik platformu şu şekildedir:
- Azure Active Directory (Azure AD) geliştirici platformunun evrimi.
- 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 apps 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:
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 Kontrolü
- Federasyon Ağ Geçidi
Important
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 için .NET 5'ten .NET 6'ya geçiş.
Daha fazla bilgi için
Örnek kodunu görüntüleyin veya indirin (nasıl indirileceği).
Kimlik doğrulaması ile bir Blazor Web App oluşturun
Tek Tek Hesaplarla bir ASP.NET Core Blazor Web App project oluşturun.
Note
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 project IdentityRazor bileşenlerini içerir. Bileşenler, sunucu project Components/Account klasöründe bulunur. Örneğin:
Components/Account/Pages/Register.razorComponents/Account/Pages/Login.razorComponents/Account/Pages/Manage/ChangePassword.razor
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. Bireysel Hesaplar ile Blazor Web App oluşturduğunuzda, IdentityRazor bileşenleri oluşturulan projeye eklenir.
Identity
Razor bileşenleri, Components/Account proje şablonunda (Blazor Web App GitHub deposu) sunucu projesinin dotnet/aspnetcore klasöründe de incelenebilir.
Note
.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu da bir sonraki .NET 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 bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).
Daha fazla bilgi için ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirme ve Blazor belgelerinde bunu izleyen makalelere bakın. ana ASP.NET Core belge kümesinin Güvenlik ve Identity alanındaki makalelerin çoğu Blazor uygulamaları için geçerlidir. Ancak, Blazor belge kümesi bilgilerin yerini alan veya ekleyen makaleler ve yönergeler içerir. öncelikle genel ASP.NET Core belgelerini incelemenizi ve ardından BlazorGüvenlik ve Identity belgelerindeki makalelere erişmenizi öneririz.
Razor Kimlik doğrulaması ile Sayfalar uygulaması oluşturma
Bireysel Hesaplar ile bir ASP.NET Core Web Uygulaması (Razor Sayfaları) projesi oluşturun.
- ASP.NET Core Web App (Razor Pages) şablonunu seçin. sonrakiseçin.
- Kimlik doğrulama türü içinTek Tek Hesaplar'ı seçin.
- Oluştur'i seçin.
Oluşturulan proje Identity alanıyla sonlandırıcıları kullanıma sunar. Örneğin:
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/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 bkz. ASP.NET Core projelerinde Scaffold Identity.
Kimlik doğrulaması ile MVC uygulaması oluşturma
Tek Tek Hesaplarla ASP.NET Core MVC project 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 Identity alanı kullanarak uç noktaları sunar. Örneğin:
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/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 bkz. ASP.NET Core projelerinde Scaffold Identity.
Migrasyonları 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
- View menüsünden SQL Server Nesne Gezgini (SSOX) öğesini seçin.
- (localdb)MSSQLLocalDB(SQL Server 13) 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, UseAuthenticationve UseAuthorization önceki kodda gösterilen sırayla çağrılmalıdır.
hakkında IdentityOptionsdaha fazla bilgi için bkz IdentityOptions . ve Uygulama Başlatma.
ASP.NET Core Identity ölçümleri
ASP.NET Core Identity ölçümleri, kullanıcı yönetimi ve kimlik doğrulama işlemleri için izleme özellikleri sağlar. Bu ölçümler, güvenlik tehditlerini gösterebilecek olağan dışı oturum açma düzenlerini algılamanıza, kimlik işlemlerinin performansını izlemenize ve kullanıcıların iki öğeli kimlik doğrulaması gibi kimlik doğrulama özellikleriyle nasıl etkileşimde bulunduğunu anlamanıza yardımcı olur. Bu gözlemlenebilirlik, katı güvenlik gereksinimleri olan veya yüksek kimlik doğrulama trafiği yaşayan uygulamalar için özellikle değerlidir.
Kullanılabilir ölçümler ve bunların nasıl kullanılacağı hakkında tüm ayrıntılar için bkz. ASP.NET Core ölçümleri.
iskele oluşturma, oturum açma, oturum kapatma ve kayıt onayı
Register, Login, LogOutve RegisterConfirmation dosyalarını ekleyin. Bu bölümde gösterilen kodu oluşturmak için Scaffold kimliğini yetkilendirme içeren bir Razor proje yönergelerini izleyin.
Yazmaç'ı 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.RegisterConfirmationyalnı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ı, sistem tarafından kimlik doğrulaması yapılmadığında veya erişim izni olmayan kısıtlı bir sayfaya erişmeye çalıştığında.
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ı alma 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 proje ş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şenleri
Tüm Identity bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçeveye dahil edilmiştir.
Identity için birincil paket Microsoft.AspNetCore.Identity'dir. Bu paket, ASP.NET Core Identity için temel arabirim kümesini içerir ve Microsoft.AspNetCore.Identity.EntityFrameworkCore tarafından dahil edilir.
ASP.NET Core Identity geçiş yapmak
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 kullanıma sunulmuştur. Çağırma AddDefaultIdentity , aşağıdakileri çağırmaya benzer:
Daha fazla bilgi için bkz. AddDefaultIdentity source.
Statik Identity varlıkların yayımlanmasını engelleme
Statik Identity varlıklarının (Identity UI için stil sayfaları ve JavaScript dosyaları) web köküne yayımlanmasını önlemek için aşağıdaki ResolveStaticWebAssetsInputsDependsOn özelliğini ve RemoveIdentityAssets hedefini uygulamanın project dosyasına 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ğrulaması ve yetkilendirme
- ASP.NET Core Identity kaynak kodu
- ASP.NET Core'da Rollerle Nasıl ÇalışılırIdentity
- SQLite kullanarak Identity yapılandırma hakkında bilgi için bkz. SQLite için Identity yapılandırma (
dotnet/AspNetCore.Docs#5131). - Identity yapılandırma
- Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma
- Identity için kullanıcı verilerini ekleme, indirme ve silme
- TOTP kimlik doğrulaması için QR kodu oluşturmayı etkinleştirme
- Kimlik Doğrulama ve Identity ASP.NET Core'a Geçirin
- Hesap onayı ve parola kurtarma
- ASP.NET Core'da çok faktörlü kimlik doğrulama
- Web çiftliğinde ASP.NET Core'u barındır
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.
Tüm uygulama kullanıcıları için kimlik doğrulaması gerektirme hakkında bilgi için bkz. Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma.
Identity kaynak kodu GitHub'da mevcut. 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 SQL Server veritabanı kullanılarak yapılandırılır. Alternatif olarak, Azure Tablo Depolaması gibi başka bir kalıcı depolama 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 IdentityMicrosoft kimlik platformu ile ilişkili değildir. Microsoft kimlik platformu şu şekildedir:
- Azure Active Directory (Azure AD) geliştirici platformunun evrimi.
- 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 apps 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:
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 Kontrolü
- Federasyon Ağ Geçidi
Important
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 için .NET 5'ten .NET 6'ya geçiş.
Daha fazla bilgi için
Örnek kodunu görüntüleyin veya indirin (nasıl indirileceği).
Kimlik doğrulaması ile Web uygulaması oluşturma
Bireysel Kullanıcı Hesaplarıyla bir ASP.NET Core Web Uygulama projesi oluşturun.
- ASP.NET Core Web App şablonunu seçin. Projeyi, proje indirme ile aynı ad alanına sahip olacak şekilde WebApp1 olarak adlandırın. Tamam'a tıklayın.
- Kimlik doğrulama türü girişinde Bireysel Kullanıcı Hesapları'nı seçin.
Oluşturulan proje, Identity sınıf kitaplığı olarak ASP.NET Core Razor sağlar.
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önetim
Migrasyonları 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
- View menüsünden SQL Server Nesne Gezgini (SSOX) öğesini seçin.
- (localdb)MSSQLLocalDB(SQL Server 13) 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, UseAuthenticationve UseAuthorization önceki kodda gösterilen sırayla çağrılmalıdır.
hakkında IdentityOptionsdaha fazla bilgi için bkz IdentityOptions . ve Uygulama Başlatma.
iskele oluşturma, oturum açma, oturum kapatma ve kayıt onayı
Register, Login, LogOutve RegisterConfirmation dosyalarını ekleyin. Bu bölümde gösterilen kodu oluşturmak için Scaffold kimliğini yetkilendirme içeren bir Razor proje yönergelerini izleyin.
Yazmaç'ı 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.RegisterConfirmationyalnı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ı, sistem tarafından kimlik doğrulaması yapılmadığında veya erişim izni olmayan kısıtlı bir sayfaya erişmeye çalıştığında.
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ı alma 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 proje ş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şenleri
Tüm Identity bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçeveye dahil edilmiştir.
Identity için birincil paket Microsoft.AspNetCore.Identity'dir. Bu paket, ASP.NET Core Identity için temel arabirim kümesini içerir ve Microsoft.AspNetCore.Identity.EntityFrameworkCore tarafından dahil edilir.
ASP.NET Core Identity geçiş yapmak
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 kullanıma sunulmuştur. Çağırma AddDefaultIdentity , aşağıdakileri çağırmaya benzer:
Daha fazla bilgi için bkz. AddDefaultIdentity source.
Statik Identity varlıkların yayımlanmasını engelleme
Statik Identity varlıklarının (Identity UI için stil sayfaları ve JavaScript dosyaları) web köküne yayımlanmasını önlemek için aşağıdaki ResolveStaticWebAssetsInputsDependsOn özelliğini ve RemoveIdentityAssets hedefini uygulamanın project dosyasına 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 bkz. Identity.
- Identity yapılandırma
- Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma
- Identity için kullanıcı verilerini ekleme, indirme ve silme
- TOTP kimlik doğrulaması için QR kodu oluşturmayı etkinleştirme
- Kimlik Doğrulama ve Identity ASP.NET Core'a Geçirin
- Hesap onayı ve parola kurtarma
- ASP.NET Core'da SMS ile iki faktörlü kimlik doğrulama
- Web çiftliğinde ASP.NET Core'u barındır
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.
Tüm uygulama kullanıcıları için kimlik doğrulaması gerektirme hakkında bilgi için bkz. Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma.
Identity kaynak kodu GitHub'da mevcut. 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 SQL Server veritabanı kullanılarak yapılandırılır. Alternatif olarak, Azure Tablo Depolaması gibi başka bir kalıcı depolama 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.
- Azure Active Directory (Azure AD) geliştirici platformunun evrimi.
- ASP.NET Core uygulamalarında kimlik doğrulaması ve yetkilendirme için alternatif bir kimlik çözümü.
- ASP.NET Core Identity ile ilgili değildir.
ASP.NET Core Identity, ASP.NET Core web apps 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
- 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 Kontrolü
- 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 Community OSS kimlik doğrulama seçenekleri
Örnek kodunu görüntüleyin veya indirin (nasıl indirileceği).
Kimlik doğrulaması ile Web uygulaması oluşturma
Bireysel Kullanıcı Hesaplarıyla bir ASP.NET Core Web Uygulama projesi oluşturun.
- File>New>Project öğesini seçin.
- ASP.NET Core Web Uygulaması öğesini seçin. Projeyi, proje indirme ile aynı ad alanına sahip olacak şekilde WebApp1 olarak adlandırın. Tamam'a tıklayın.
- Bir ASP.NET Core Web Uygulaması seçin, ardından Kimlik Doğrulamayı Değiştir'i seçin.
- Bireysel Kullanıcı Hesapları'nı seçin ve Tamam'a tıklayın.
Oluşturulan proje, Identity sınıf kitaplığı olarak ASP.NET Core Razor sağlar.
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önetim
Migrasyonları 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
- View menüsünden SQL Server Nesne Gezgini (SSOX) öğesini seçin.
- (localdb)MSSQLLocalDB(SQL Server 13) 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, UseAuthorizationve 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, LogOutve RegisterConfirmation dosyalarını ekleyin. Bu bölümde gösterilen kodu oluşturmak için Scaffold kimliğini yetkilendirme içeren bir Razor proje yönergelerini izleyin.
Yazmaç'ı 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.RegisterConfirmationyalnı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ı, sistem tarafından kimlik doğrulaması yapılmadığında veya erişim izni olmayan kısıtlı bir sayfaya erişmeye çalıştığında.
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ı alma 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 proje ş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şenleri
Tüm Identity bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçeveye dahil edilmiştir.
Identity için birincil paket Microsoft.AspNetCore.Identity'dir. Bu paket, ASP.NET Core Identity için temel arabirim kümesini içerir ve Microsoft.AspNetCore.Identity.EntityFrameworkCore tarafından dahil edilir.
ASP.NET Core Identity geçiş yapmak
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
Statik Identity varlıklarının (Identity UI için stil sayfaları ve JavaScript dosyaları) web köküne yayımlanmasını önlemek için aşağıdaki ResolveStaticWebAssetsInputsDependsOn özelliğini ve RemoveIdentityAssets hedefini uygulamanın project dosyasına 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 Identity kaynak kodu
- AddDefaultIdentity kaynağı
- SQLite kullanarak yapılandırma hakkında bilgi için bkz. Identity.
- Identity yapılandırma
- Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma
- Identity için kullanıcı verilerini ekleme, indirme ve silme
- TOTP kimlik doğrulaması için QR kodu oluşturmayı etkinleştirme
- Kimlik Doğrulama ve Identity ASP.NET Core'a Geçirin
- Hesap onayı ve parola kurtarma
- ASP.NET Core'da SMS ile iki faktörlü kimlik doğrulama
- Web çiftliğinde ASP.NET Core'u barındır
ASP.NET Core