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 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 ile şablon etkileşimini gö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 Table Storage gibi başka bir kalıcı depolama kullanılabilir.
Bu konuda, 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 uygulamalar 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:
- Microsoft Entra ID
- Duende Sunucusu
Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende 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 Software, Duende 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 Duende Server belgelerine (Duende Software web sitesi)
Örnek kodunu görüntüleyin veya indirin (nasıl indirileceği).
Kimlik doğrulaması ile bir oluşturun
Tek Tek Hesaplarla bir ASP.NET Core Blazor Web App project oluşturun.
Note
Sayfalar deneyimi için Kimlik doğrulaması ile Sayfalar uygulaması oluşturma bölümüne bakın.
MVC deneyimi için Kimlik doğrulaması ile MVC uygulaması oluşturma bölümüne bakın.
- Ş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
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 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, 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.
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
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, bir Razor sınıf kitaplığı (RCL) olarak ASP.NET Core Identity sağlar. Sınıf kitaplığı Pages'a dayanır ve 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.
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. AspNetUsersGörünüm Verileri:
hizmetlerini yapılandırın
Hizmetler 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 . Hizmetler bağımlılık enjeksiyonu yoluyla uygulamanın kullanımına sunulur.
çağrısıyla etkinleştirilir. , istek işlem hattına kimlik doğrulama ara yazılımı ekler.
Şablon tarafından oluşturulan uygulama yetkilendirme kullanmaz. uygulamanın yetkilendirme eklemesi halinde doğru sırada eklendiğinden emin olmak için dahil edilir. , ve önceki kodda gösterilen sırayla çağrılmalıdır.
hakkında daha fazla bilgi için bkz . 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ı
, , ve 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 Kaydol düğmesine tıklandığında, eylemi çağrılır. Kullanıcı, tarafından 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 onaylanması için bir bağlantı seçebileceği konuma yönlendirilir. Varsayılan değer yalnızca test için kullanılır, üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.
Onaylanan bir hesap gerektirmek ve kayıt sırasında hemen oturum açmayı önlemek için içinde 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, eylem çağrılır. , 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ır.
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 kodun yeniden yönlendirme olması gerekir.
, bir içinde depolanan kullanıcının taleplerini temizler.
Gönderi 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
Varsayılan web proje şablonları, giriş sayfalarına anonim erişime izin verir. Test etmek için ekleyin ve 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 bağlantısını seçin. Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin:
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.
Bileşen
Tüm Identity bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçeveye dahil edilmiştir.
için birincil paket Microsoft.AspNetCore.'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 mağazanızı taşımak hakkında daha fazla bilgi ve kılavuz için bkz: Kimlik Doğrulamasını Taşıma ve .
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 , aşağıdakileri çağırmaya benzer:
Daha fazla bilgi için bkz. AddDefaultIdentity source.
Statik 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). - Yapılandırmak
- Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma
- ASP.NET Core projektinde Identity kullanıcı verilerini ekleme, indirme ve silme
ASP.NET Core - Kimlik Doğrulama ve Identity ASP.NET Core'a Geçirin
- ASP.NET Core'da Hesap onayı ve şifre 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 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 ile şablon etkileşimini gö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 Table Storage gibi başka bir kalıcı depolama kullanılabilir.
Bu konuda, 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 uygulamalar 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:
- Microsoft Entra ID
- Duende Sunucusu
Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende 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 Software, Duende 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 Duende Server belgelerine (Duende Software web sitesi)
Ö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, Razor sınıf kitaplığı olarak ASP.NET Core Identity sağlar. sınıf kitaplığı, alanıyla sonlandırıcıları kullanıma sunar. Örneğin:
- //Hesap/Giriş
- //Hesap/Çıkış Yap
- //Hesap/Yönet
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.
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. AspNetUsersGörünüm Verileri:
hizmetlerini yapılandırın
Hizmetler 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 . Hizmetler bağımlılık enjeksiyonu yoluyla uygulamanın kullanımına sunulur.
çağrısıyla etkinleştirilir. , istek işlem hattına kimlik doğrulama ara yazılımı ekler.
Şablon tarafından oluşturulan uygulama yetkilendirme kullanmaz. uygulamanın yetkilendirme eklemesi halinde doğru sırada eklendiğinden emin olmak için dahil edilir. , ve önceki kodda gösterilen sırayla çağrılmalıdır.
hakkında daha fazla bilgi için bkz . ve Uygulama Başlatma.
iskele oluşturma, oturum açma, oturum kapatma ve kayıt onayı
, , ve 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 Kaydol düğmesine tıklandığında, eylemi çağrılır. Kullanıcı, tarafından 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 onaylanması için bir bağlantı seçebileceği konuma yönlendirilir. Varsayılan değer yalnızca test için kullanılır, üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.
Onaylanan bir hesap gerektirmek ve kayıt sırasında hemen oturum açmayı önlemek için içinde 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, eylem çağrılır. , 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ır.
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 kodun yeniden yönlendirme olması gerekir.
, bir içinde depolanan kullanıcının taleplerini temizler.
Gönderi 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
Varsayılan web proje şablonları, giriş sayfalarına anonim erişime izin verir. Test etmek için ekleyin ve 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 bağlantısını seçin. Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin:
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.
Bileşen
Tüm Identity bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçeveye dahil edilmiştir.
için birincil paket Microsoft.AspNetCore.'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 mağazanızı taşımak hakkında daha fazla bilgi ve kılavuz için bkz: Kimlik Doğrulamasını Taşıma ve .
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 , aşağıdakileri çağırmaya benzer:
Daha fazla bilgi için bkz. AddDefaultIdentity source.
Statik 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.
- Yapılandırmak
- Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma
- ASP.NET Core projektinde Identity kullanıcı verilerini ekleme, indirme ve silme
ASP.NET Core - Kimlik Doğrulama ve Identity ASP.NET Core'a Geçirin
- ASP.NET Core'da Hesap onayı ve şifre 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 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 ile şablon etkileşimini gö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 Table Storage gibi başka bir kalıcı depolama kullanılabilir.
Bu konuda, 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 uygulamalar 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, Razor sınıf kitaplığı olarak ASP.NET Core Identity sağlar. sınıf kitaplığı, alanıyla sonlandırıcıları kullanıma sunar. Örneğin:
- //Hesap/Giriş
- //Hesap/Çıkış Yap
- //Hesap/Yönet
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.
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. AspNetUsersGörünüm Verileri:
hizmetlerini yapılandırın
Hizmetler eklenir. Tipik desen, önce tüm yöntemlerini ve ardından tüm 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, 'yi varsayılan seçenek değerleriyle yapılandırır. Hizmetler bağımlılık enjeksiyonu yoluyla uygulamanın kullanımına sunulur.
çağrısıyla etkinleştirilir. , 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 . Hizmetler bağımlılık enjeksiyonu yoluyla uygulamanın kullanımına sunulur.
çağrısıyla etkinleştirilir. , 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. uygulamanın yetkilendirme eklemesi halinde doğru sırada eklendiğinden emin olmak için dahil edilir. , , ve önceki kodda gösterilen sırayla çağrılmalıdır.
ve hakkında daha fazla bilgi için ve Uygulama Başlatma'ya bakın.
iskele oluşturma, oturum açma, oturum kapatma ve kayıt onayı
, , ve 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 Kaydol düğmesine tıklandığında, eylemi çağrılır. Kullanıcı, tarafından 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 onaylanması için bir bağlantı seçebileceği konuma yönlendirilir. Varsayılan değer yalnızca test için kullanılır, üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.
Onaylanan bir hesap gerektirmek ve kayıt sırasında hemen oturum açmayı önlemek için içinde 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, eylem çağrılır. , 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ır.
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 kodun yeniden yönlendirme olması gerekir.
, bir içinde depolanan kullanıcının taleplerini temizler.
Gönderi 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
Varsayılan web proje şablonları, giriş sayfalarına anonim erişime izin verir. Test etmek için ekleyin ve 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 bağlantısını seçin. Oturum açma sayfasına yönlendirilirsiniz.
Keşfedin:
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.
Bileşen
Tüm Identity bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçeveye dahil edilmiştir.
için birincil paket Microsoft.AspNetCore.'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 mağazanızı taşımak hakkında daha fazla bilgi ve kılavuz için bkz: Kimlik Doğrulamasını Taşıma ve .
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 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.
- Yapılandırmak
- Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma
- ASP.NET Core projektinde Identity kullanıcı verilerini ekleme, indirme ve silme
ASP.NET Core - Kimlik Doğrulama ve Identity ASP.NET Core'a Geçirin
- ASP.NET Core'da Hesap onayı ve şifre 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