Aracılığıyla paylaş


ASP.NET Core'a Identity giriş

Gönderen Rick Anderson

ASP.NET Core Identity:

  • Kullanıcı arabirimi (UI) oturum açma işlevini destekleyen bir API'dir.
  • Kullanıcıları, parolaları, profil verilerini, rolleri, talepleri, belirteçleri, e-posta onaylarını ve daha fazlasını yönetir.

Kullanıcılar, içinde Identity depolanan oturum açma bilgileriyle bir hesap oluşturabilir veya bir dış oturum açma sağlayıcısı kullanabilir. Desteklenen dış oturum açma sağlayıcıları Facebook, Google, Microsoft Hesabı ve Twitter'dır.

Genel olarak tüm kullanıcıların kimliğinin doğrulanmış olmasını gerektirme hakkında bilgi için bkz . Kimliği doğrulanmış kullanıcılar gerektirme.

Identity Kaynak kodu GitHub'da kullanılabilir. Identity ile Identityşablon etkileşimini gözden geçirmek için iskele oluşturun ve oluşturulan dosyaları görüntüleyin.

Identity genellikle kullanıcı adlarını, parolaları ve profil verilerini depolamak için bir SQL Server veritabanı kullanılarak yapılandırılır. Alternatif olarak, azure tablo depolama gibi başka bir kalıcı depo kullanılabilir.

Bu konuda, bir kullanıcıyı kaydetmek, oturum açmak ve oturumu açmak için kullanmayı Identity öğreneceksiniz. Not: Şablonlar kullanıcı adı ve e-postayı kullanıcılar için aynı şekilde ele alır. kullanan Identityuygulamalar oluşturma hakkında daha ayrıntılı yönergeler için bkz . Sonraki Adımlar.

ASP.NET CoreIdentity, Microsoft identity platformuyla ilgili değildir. Microsoft identity platformu şu şekildedir:

  • Azure Active Directory (Azure AD) geliştirici platformunun gelişimi.
  • ASP.NET Core uygulamalarında kimlik doğrulaması ve yetkilendirme için alternatif identity bir çözüm.

ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:

Duende Identity Server, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende Identity Sunucusu aşağıdaki güvenlik özelliklerini etkinleştirir:

  • Hizmet Olarak Kimlik Doğrulaması (AaaS)
  • Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
  • API'ler için erişim denetimi
  • Federasyon Ağ Geçidi

Önemli

Duende Yazılımı, Duende Identity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için, bkz. ASP.NET Core 5.0'den 6.0'a geçiş.

Daha fazla bilgi için Duende Server belgelerine (Duende Yazılım web sitesi) bakın.Identity

Örnek kodu görüntüleyin veya indirin (nasıl indirilir).

Kimlik doğrulaması ile Web uygulaması oluşturma

Tek Tek Kullanıcı Hesaplarıyla ASP.NET Core Web Uygulaması projesi oluşturun.

  • ASP.NET Core Web Uygulaması şablonunu seçin. Proje indirme işlemiyle aynı ad alanına sahip olması için projeyi WebApp1 olarak adlandırın. Tamam'a tıklayın.
  • Kimlik doğrulaması türü girişinde Bireysel Kullanıcı Hesapları’nı seçin.

Oluşturulan proje, sınıf kitaplığı olarak ASP.NET Core Identity sağlar.Razor IdentityRazor Sınıf kitaplığı, alanıyla uç Identity noktaları kullanıma sunar. Örneğin:

  • /Identity/Account/Login
  • /Identity/Account/Logout
  • /Identity/Hesap/Yönet

Geçişleri uygulama

Veritabanını başlatmak için geçişleri uygulayın.

Paket Yöneticisi Konsolu'nda (PMC) aşağıdaki komutu çalıştırın:

Update-Database

Test Kaydı ve Oturum Açma

Uygulamayı çalıştırın ve bir kullanıcı kaydedin. Ekran boyutunuz bağlı olarak, Kaydet ve Oturum Aç bağlantılarını görmek için gezinti iki durumlu düğmesini seçmeniz gerekebilir.

Identity Veritabanını görüntüleme

  • Görünüm menüsünde SQL Server Nesne Gezgini (SSOX) öğesini seçin.
  • (localdb)MSSQLLocalDB(SQL Server 13)'e gidin. Dbo'ya sağ tıklayın. AspNetUsers>Görünüm Verileri:

SQL Server'da AspNetUsers tablosunda bağlam menüsü Nesne Gezgini

Hizmetleri yapılandırma Identity

Hizmetler'e Program.cseklenir. Tipik desen, yöntemleri aşağıdaki sırayla çağırmaktır:

  1. Add{Service}
  2. builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();

builder.Services.Configure<IdentityOptions>(options =>
{
    // Password settings.
    options.Password.RequireDigit = true;
    options.Password.RequireLowercase = true;
    options.Password.RequireNonAlphanumeric = true;
    options.Password.RequireUppercase = true;
    options.Password.RequiredLength = 6;
    options.Password.RequiredUniqueChars = 1;

    // Lockout settings.
    options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
    options.Lockout.MaxFailedAccessAttempts = 5;
    options.Lockout.AllowedForNewUsers = true;

    // User settings.
    options.User.AllowedUserNameCharacters =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
    options.User.RequireUniqueEmail = false;
});

builder.Services.ConfigureApplicationCookie(options =>
{
    // Cookie settings
    options.Cookie.HttpOnly = true;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

    options.LoginPath = "/Identity/Account/Login";
    options.AccessDeniedPath = "/Identity/Account/AccessDenied";
    options.SlidingExpiration = true;
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();

Yukarıdaki kod varsayılan seçenek değerleriyle yapılandırılır Identity . Hizmetler, bağımlılık ekleme yoluyla uygulamanın kullanımına sunulur.

Identity çağrısıyla UseAuthenticationetkinleştirilir. UseAuthentication , istek işlem hattına kimlik doğrulama ara yazılımı ekler.

Şablon tarafından oluşturulan uygulama yetkilendirme kullanmaz. app.UseAuthorization uygulamanın yetkilendirme eklemesi halinde doğru sırada eklendiğinden emin olmak için dahil edilir. UseRouting, 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.

yapı iskelesi yazma, oturum açma, logout ve registerconfirmation

Register, Login, LogOutve RegisterConfirmation dosyalarını ekleyin. identity Bu bölümde gösterilen kodu oluşturmak için yetkilendirme yönergeleriyle birlikte bir Razor projenin iskelesini izleyin.

Yazmaç'ı inceleyin

Kullanıcı sayfadaki Kaydet düğmesine Register tıkladığında, RegisterModel.OnPostAsync eylem çağrılır. Kullanıcı nesnesinde _userManager tarafından CreateAsync(TUser) oluşturulur:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
                                          .ToList();
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            if (_userManager.Options.SignIn.RequireConfirmedAccount)
            {
                return RedirectToPage("RegisterConfirmation", 
                                      new { email = Input.Email });
            }
            else
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                return LocalRedirect(returnUrl);
            }
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Varsayılan hesap doğrulamayı devre dışı bırakma

Varsayılan şablonlarla, kullanıcı hesabın Account.RegisterConfirmation onaylanması için bir bağlantı seçebileceği konuma yönlendirilir. Varsayılan değer Account.RegisterConfirmation yalnızca test için kullanılır, üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.

Onaylanan bir hesap gerektirmek ve kayıt sırasında hemen oturum açmayı önlemek için içinde /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.csayarlayınDisplayConfirmAccountLink = false:

[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly IEmailSender _sender;

    public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
    {
        _userManager = userManager;
        _sender = sender;
    }

    public string Email { get; set; }

    public bool DisplayConfirmAccountLink { get; set; }

    public string EmailConfirmationUrl { get; set; }

    public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
    {
        if (email == null)
        {
            return RedirectToPage("/Index");
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return NotFound($"Unable to load user with email '{email}'.");
        }

        Email = email;
        // Once you add a real email sender, you should remove this code that lets you confirm the account
        DisplayConfirmAccountLink = false;
        if (DisplayConfirmAccountLink)
        {
            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            EmailConfirmationUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
                protocol: Request.Scheme);
        }

        return Page();
    }
}

Oturum açma

Oturum açma formu şu durumlarda görüntülenir:

  • Oturum aç bağlantısı seçilidir.
  • Kullanıcı, erişim yetkisi olmayan veya sistem tarafından kimlik doğrulaması yapılmamış kısıtlı bir sayfaya erişmeye çalışır.

Oturum Açma sayfasındaki form gönderildiğinde, OnPostAsync eylem çağrılır. PasswordSignInAsync nesnesinde çağrılır _signInManager .

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email,
                           Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new
            {
                ReturnUrl = returnUrl,
                RememberMe = Input.RememberMe
            });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Yetkilendirme kararları verme hakkında bilgi için bkz . ASP.NET Core'da yetkilendirmeye giriş.

Oturumu kapat

Oturumu kapat bağlantısı eylemi çağırırLogoutModel.OnPost.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return RedirectToPage();
            }
        }
    }
}

Yukarıdaki kodda, tarayıcının yeni bir istek gerçekleştirmesi ve identity kullanıcının güncelleştirilmesi için kodun return RedirectToPage(); yeniden yönlendirme olması gerekir.

SignOutAsync kullanıcının içinde cookiedepolanan taleplerini temizler.

Gönderi, içinde Pages/Shared/_LoginPartial.cshtmlbelirtilir:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <a  class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" 
                                              title="Manage">Hello @User.Identity.Name!</a>
    </li>
    <li class="nav-item">
        <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                                  asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                                  method="post" >
            <button  type="submit" class="nav-link btn btn-link text-dark">Logout</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
}
</ul>

Test Identity

Varsayılan web projesi şablonları sayfalara anonim erişim sağlar home . test Identityetmek için ekleyin [Authorize]:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        private readonly ILogger<PrivacyModel> _logger;

        public PrivacyModel(ILogger<PrivacyModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
        }
    }
}

Oturum açtıysanız oturumu kapatın. Uygulamayı çalıştırın ve bağlantıyı seçin Privacy . Oturum açma sayfasına yönlendirilirsiniz.

Keşfedin: Identity

Daha ayrıntılı incelemek Identity için:

Identity Bileşen

IdentityTüm bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçevesine dahil edilir.

için Identity birincil paket Microsoft.AspNetCore.Identity. Bu paket, ASP.NET Core Identityiçin çekirdek arabirim kümesini içerir ve tarafından Microsoft.AspNetCore.Identity.EntityFrameworkCoredahil edilir.

ASP.NET Core'a geçiş Identity

Mevcut Identity deponuzu geçirme hakkında daha fazla bilgi ve kılavuz için bkz . Kimlik Doğrulamasını Geçirme ve Identity.

Parola gücünü ayarlama

En düşük parola gereksinimlerini ayarlayan bir örnek için yapılandırma bölümüne bakın.

AddDefaultIdentity ve AddIdentity

AddDefaultIdentity ASP.NET Core 2.1'de tanıtıldı. Çağırma AddDefaultIdentity , aşağıdakileri çağırmaya benzer:

Daha fazla bilgi için bkz . AddDefaultIdentity kaynağı .

Statik Identity varlıkların yayımlanmasını engelleme

Web kökünde statik Identity varlıkların (kullanıcı arabirimi için stil sayfaları ve JavaScript dosyaları) yayımlanmasını önlemek için Identity aşağıdaki ResolveStaticWebAssetsInputsDependsOn özelliği ekleyin ve RemoveIdentityAssets uygulamanın proje dosyasına hedefleyin:

<PropertyGroup>
  <ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>

<Target Name="RemoveIdentityAssets">
  <ItemGroup>
    <StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
  </ItemGroup>
</Target>

Sonraki Adımlar

Gönderen Rick Anderson

ASP.NET Core Identity:

  • Kullanıcı arabirimi (UI) oturum açma işlevini destekleyen bir API'dir.
  • Kullanıcıları, parolaları, profil verilerini, rolleri, talepleri, belirteçleri, e-posta onaylarını ve daha fazlasını yönetir.

Kullanıcılar, içinde Identity depolanan oturum açma bilgileriyle bir hesap oluşturabilir veya bir dış oturum açma sağlayıcısı kullanabilir. Desteklenen dış oturum açma sağlayıcıları Facebook, Google, Microsoft Hesabı ve Twitter'dır.

Genel olarak tüm kullanıcıların kimliğinin doğrulanmış olmasını gerektirme hakkında bilgi için bkz . Kimliği doğrulanmış kullanıcılar gerektirme.

Identity Kaynak kodu GitHub'da kullanılabilir. Identity ile Identityşablon etkileşimini gözden geçirmek için iskele oluşturun ve oluşturulan dosyaları görüntüleyin.

Identity genellikle kullanıcı adlarını, parolaları ve profil verilerini depolamak için bir SQL Server veritabanı kullanılarak yapılandırılır. Alternatif olarak, azure tablo depolama gibi başka bir kalıcı depo kullanılabilir.

Bu konuda, bir kullanıcıyı kaydetmek, oturum açmak ve oturumu açmak için kullanmayı Identity öğreneceksiniz. Not: Şablonlar kullanıcı adı ve e-postayı kullanıcılar için aynı şekilde ele alır. kullanan Identityuygulamalar oluşturma hakkında daha ayrıntılı yönergeler için bkz . Sonraki Adımlar.

Microsoft identity platformu şu şekildedir:

  • Azure Active Directory (Azure AD) geliştirici platformunun gelişimi.
  • ASP.NET Core uygulamalarında kimlik doğrulaması ve yetkilendirme için alternatif identity bir çözüm.
  • ASP.NET Core Identityile ilgili değildir.

ASP.NET Core Identity , ASP.NET Core web uygulamalarına kullanıcı arabirimi (UI) oturum açma işlevi ekler. Web API'lerinin ve SPA'larının güvenliğini sağlamak için aşağıdakilerden birini kullanın:

Duende IdentityServer, ASP.NET Core için bir OpenID Connect ve OAuth 2.0 çerçevesidir. Duende IdentityServer aşağıdaki güvenlik özelliklerini etkinleştirir:

  • Hizmet Olarak Kimlik Doğrulaması (AaaS)
  • Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
  • API'ler için erişim denetimi
  • Federasyon Ağ Geçidi

Daha fazla bilgi için bkz . Duende IdentityServer'a Genel Bakış.

Diğer kimlik doğrulama sağlayıcıları hakkında daha fazla bilgi için bkz . ASP.NET Core için Topluluk İşletim Sistemi kimlik doğrulama seçenekleri

Örnek kodu görüntüleyin veya indirin (nasıl indirilir).

Kimlik doğrulaması ile Web uygulaması oluşturma

Tek Tek Kullanıcı Hesaplarıyla ASP.NET Core Web Uygulaması projesi oluşturun.

  • Dosya>Yeni>Proje’yi seçin.
  • ASP.NET Çekirdek Web Uygulaması'nı seçin. Proje indirme işlemiyle aynı ad alanına sahip olması için projeyi WebApp1 olarak adlandırın. Tamam'a tıklayın.
  • bir ASP.NET Core Web Uygulaması seçin ve ardından Kimlik Doğrulamasını Değiştir'i seçin.
  • Bireysel Kullanıcı Hesapları'nı seçin ve Tamam'a tıklayın.

Oluşturulan proje, sınıf kitaplığı olarak ASP.NET Core Identity sağlar.Razor IdentityRazor Sınıf kitaplığı, alanıyla uç Identity noktaları kullanıma sunar. Örneğin:

  • /Identity/Account/Login
  • /Identity/Account/Logout
  • /Identity/Hesap/Yönet

Geçişleri uygulama

Veritabanını başlatmak için geçişleri uygulayın.

Paket Yöneticisi Konsolu'nda (PMC) aşağıdaki komutu çalıştırın:

PM> Update-Database

Test Kaydı ve Oturum Açma

Uygulamayı çalıştırın ve bir kullanıcı kaydedin. Ekran boyutunuz bağlı olarak, Kaydet ve Oturum Aç bağlantılarını görmek için gezinti iki durumlu düğmesini seçmeniz gerekebilir.

Identity Veritabanını görüntüleme

  • Görünüm menüsünde SQL Server Nesne Gezgini (SSOX) öğesini seçin.
  • (localdb)MSSQLLocalDB(SQL Server 13)'e gidin. Dbo'ya sağ tıklayın. AspNetUsers>Görünüm Verileri:

SQL Server'da AspNetUsers tablosunda bağlam menüsü Nesne Gezgini

Hizmetleri yapılandırma Identity

Hizmetler'e ConfigureServiceseklenir. Tipik desen, tüm yöntemleri çağırmak Add{Service} ve ardından tüm yöntemleri çağırmaktır services.Configure{Service} .

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
     // options.UseSqlite(
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });
}

Yukarıdaki vurgulanan kod varsayılan seçenek değerleriyle yapılandırılır Identity . Hizmetler, bağımlılık ekleme yoluyla uygulamanın kullanımına sunulur.

Identity çağrısıyla UseAuthenticationetkinleştirilir. UseAuthentication , istek işlem hattına kimlik doğrulama ara yazılımı ekler.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        // options.UseSqlite(
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });
}

Yukarıdaki kod varsayılan seçenek değerleriyle yapılandırılır Identity . Hizmetler, bağımlılık ekleme yoluyla uygulamanın kullanımına sunulur.

Identity çağrısıyla UseAuthenticationetkinleştirilir. UseAuthentication , istek işlem hattına kimlik doğrulama ara yazılımı ekler.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Şablon tarafından oluşturulan uygulama yetkilendirme kullanmaz. app.UseAuthorization uygulamanın yetkilendirme eklemesi halinde doğru sırada eklendiğinden emin olmak için dahil edilir. UseRouting, UseAuthentication, UseAuthorizationve UseEndpoints önceki kodda gösterilen sırayla çağrılmalıdır.

ve hakkında IdentityOptions daha fazla bilgi için bkzIdentityOptions. ve Uygulama BaşlatmaStartup.

yapı iskelesi yazma, oturum açma, logout ve registerconfirmation

Register, Login, LogOutve RegisterConfirmation dosyalarını ekleyin. identity Bu bölümde gösterilen kodu oluşturmak için yetkilendirme yönergeleriyle birlikte bir Razor projenin iskelesini izleyin.

Yazmaç'ı inceleyin

Kullanıcı sayfadaki Kaydet düğmesine Register tıkladığında, RegisterModel.OnPostAsync eylem çağrılır. Kullanıcı nesnesinde _userManager tarafından CreateAsync(TUser) oluşturulur:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
                                          .ToList();
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            if (_userManager.Options.SignIn.RequireConfirmedAccount)
            {
                return RedirectToPage("RegisterConfirmation", 
                                      new { email = Input.Email });
            }
            else
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                return LocalRedirect(returnUrl);
            }
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Varsayılan hesap doğrulamayı devre dışı bırakma

Varsayılan şablonlarla, kullanıcı hesabın Account.RegisterConfirmation onaylanması için bir bağlantı seçebileceği konuma yönlendirilir. Varsayılan değer Account.RegisterConfirmation yalnızca test için kullanılır, üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.

Onaylanan bir hesap gerektirmek ve kayıt sırasında hemen oturum açmayı önlemek için içinde /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.csayarlayınDisplayConfirmAccountLink = false:

[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly IEmailSender _sender;

    public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
    {
        _userManager = userManager;
        _sender = sender;
    }

    public string Email { get; set; }

    public bool DisplayConfirmAccountLink { get; set; }

    public string EmailConfirmationUrl { get; set; }

    public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
    {
        if (email == null)
        {
            return RedirectToPage("/Index");
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return NotFound($"Unable to load user with email '{email}'.");
        }

        Email = email;
        // Once you add a real email sender, you should remove this code that lets you confirm the account
        DisplayConfirmAccountLink = false;
        if (DisplayConfirmAccountLink)
        {
            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            EmailConfirmationUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
                protocol: Request.Scheme);
        }

        return Page();
    }
}

Oturum açma

Oturum açma formu şu durumlarda görüntülenir:

  • Oturum aç bağlantısı seçilidir.
  • Kullanıcı, erişim yetkisi olmayan veya sistem tarafından kimlik doğrulaması yapılmamış kısıtlı bir sayfaya erişmeye çalışır.

Oturum Açma sayfasındaki form gönderildiğinde, OnPostAsync eylem çağrılır. PasswordSignInAsync nesnesinde çağrılır _signInManager .

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email,
                           Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new
            {
                ReturnUrl = returnUrl,
                RememberMe = Input.RememberMe
            });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Yetkilendirme kararları verme hakkında bilgi için bkz . ASP.NET Core'da yetkilendirmeye giriş.

Oturumu kapat

Oturumu kapat bağlantısı eylemi çağırırLogoutModel.OnPost.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return RedirectToPage();
            }
        }
    }
}

Yukarıdaki kodda, tarayıcının yeni bir istek gerçekleştirmesi ve identity kullanıcının güncelleştirilmesi için kodun return RedirectToPage(); yeniden yönlendirme olması gerekir.

SignOutAsync kullanıcının içinde cookiedepolanan taleplerini temizler.

Gönderi, içinde Pages/Shared/_LoginPartial.cshtmlbelirtilir:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <a  class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" 
                                              title="Manage">Hello @User.Identity.Name!</a>
    </li>
    <li class="nav-item">
        <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                                  asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                                  method="post" >
            <button  type="submit" class="nav-link btn btn-link text-dark">Logout</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
}
</ul>

Test Identity

Varsayılan web projesi şablonları sayfalara anonim erişim sağlar home . test Identityetmek için ekleyin [Authorize]:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        private readonly ILogger<PrivacyModel> _logger;

        public PrivacyModel(ILogger<PrivacyModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
        }
    }
}

Oturum açtıysanız oturumu kapatın. Uygulamayı çalıştırın ve bağlantıyı seçin Privacy . Oturum açma sayfasına yönlendirilirsiniz.

Keşfedin: Identity

Daha ayrıntılı incelemek Identity için:

Identity Bileşen

IdentityTüm bağımlı NuGet paketleri ASP.NET Core paylaşılan çerçevesine dahil edilir.

için Identity birincil paket Microsoft.AspNetCore.Identity. Bu paket, ASP.NET Core Identityiçin çekirdek arabirim kümesini içerir ve tarafından Microsoft.AspNetCore.Identity.EntityFrameworkCoredahil edilir.

ASP.NET Core'a geçiş Identity

Mevcut Identity deponuzu geçirme hakkında daha fazla bilgi ve kılavuz için bkz . Kimlik Doğrulamasını Geçirme ve Identity.

Parola gücünü ayarlama

En düşük parola gereksinimlerini ayarlayan bir örnek için yapılandırma bölümüne bakın.

Statik Identity varlıkların yayımlanmasını engelleme

Web kökünde statik Identity varlıkların (kullanıcı arabirimi için stil sayfaları ve JavaScript dosyaları) yayımlanmasını önlemek için Identity aşağıdaki ResolveStaticWebAssetsInputsDependsOn özelliği ekleyin ve RemoveIdentityAssets uygulamanın proje dosyasına hedefleyin:

<PropertyGroup>
  <ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>

<Target Name="RemoveIdentityAssets">
  <ItemGroup>
    <StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
  </ItemGroup>
</Target>

Sonraki Adımlar