IdentityASP.NET Core'a 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 depolanan oturum açma bilgileriyle bir hesap Identity 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 kullanıcıların kimliklerinin nasıl doğrulandığını öğrenmek için bkz. kimliği doğrulanmış kullanıcılar gerektirme.

Kaynak Identity kodu, kaynak GitHub. İskele Identity ve ile şablon etkileşimini gözden geçirmek için oluşturulan dosyaları Identity görüntüleme.

Identitygenellikle kullanıcı adlarını, parolaları SQL Server profil verilerini depolamak için bir veritabanı kullanılarak yapılandırılır. Alternatif olarak, Azure Tablo Depolama gibi başka bir kalıcı depo Depolama.

Bu konu başlığında, bir kullanıcıya kaydolmak, oturum açmak ve oturumu açmak Identity için kullanmayı öğrenirsiniz. Not: Şablonlar kullanıcı adı ve e-postayı kullanıcılar için aynı şekilde davranır. kullanan uygulamalar oluşturma hakkında daha ayrıntılı yönergeler için Identity bkz. Sonraki Adımlar.

Microsoft kimlik platformu:

  • Azure Active Directory (Azure AD) geliştirici platformunun gelişimi.
  • ile ASP.NET Core Identity ilgisiz.

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

IdentityServer4, bir OpenID Bağlan ve OAuth 2.0 çerçevesidir ASP.NET Core. IdentityServer4 aşağıdaki güvenlik özelliklerini sağlar:

  • 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. Identity Server4'e Hoş Geldiniz.

Örnek kodu görüntüleme veya indirme (indirme).

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

Bireysel Kullanıcı ASP.NET Core bir Web Uygulaması projesi oluşturun.

  • Web Uygulaması ASP.NET Core seçin. Projeyi WebApp1 olarak, proje indirmeyle aynı ad alanına sahip olacak şekilde adlandır. Tamam'a tıklayın.
  • Kimlik doğrulaması türü girdisinde Bireysel Kullanıcı Hesapları'ni seçin.

Oluşturulan proje sınıf ASP.NET Core Identity kitaplığı olarak Razor sağlar. Sınıf Identity Razor Kitaplığı, uç noktaları alanıyla Identity birlikte ortaya çıkarır. Örnek:

  • /Identity/Account/Login
  • /Identity/Account/Logout
  • /Identity/Account/Manage

Geçişleri uygulama

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

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

Update-Database

Kayıt ve Oturum Açma TestIni Yap

Uygulamayı çalıştırın ve bir kullanıcı kaydedin. Ekran boyutunuza bağlı olarak, Kaydolma ve Oturum Açma bağlantılarını görmek için gezinti düğmesini seçmeniz gerekir.

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

  • Görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini seçin.
  • (LocalDB) MSSQLLocalDB (SQL Server 13) öğesine gidin. Dbo üzerinde sağ tıklayın . Aspnetusers > verileri görüntüle:

SQL Server Nesne Gezgini 'de AspNetUsers tablosundaki bağlamsal menü

Hizmetleri Identity yapılandırma

Hizmetler Program.cs'ye eklenir. Tipik desen, yöntemleri aşağıdaki sırayla çağırmadır:

  1. Add{Service}
  2. 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 Identity değerleriyle yapılandırılır. Hizmetler, bağımlılık ekleme aracılığıyla uygulama için kullanılabilir yapılır.

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

Şablon tarafından oluşturulan uygulama yetkilendirmeyi kullanmaz. app.UseAuthorization , uygulamanın yetkilendirme eklemesi gerekirken doğru sırada eklendiklerine emin olmak için dahil edilir. UseRouting, UseAuthentication UseAuthorization , ve önceki UseEndpoints kodda gösterilen sırayla çağrılabilir.

hakkında daha fazla bilgi IdentityOptions için IdentityOptions bkz. ve Uygulama Başlatma.

Yapı iskelesi Yazmaç, Oturum Açma, Oturum Açma, Oturum Açma ve RegisterConfirmation

, Register Login , LogOut ve dosyalarını RegisterConfirmation ekleyin. Bu bölümde gösterilen kodu oluşturmak için Yapı Razor iskelesi kimliğini yetkilendirme yönergeleriyle birlikte projeye uygulayın.

Register'i inceleme

Kullanıcı sayfada Kaydol düğmesine Register tıkladığında eylem RegisterModel.OnPostAsync çağrılır. Kullanıcı, nesnede CreateAsync tarafından _userManager 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ğrulamasını devre dışı bırak

Varsayılan Şablonlar ile Kullanıcı, Account.RegisterConfirmation hesabın onaylandığı bir bağlantı seçtikleri yere yönlendirilir. Varsayılan değer Account.RegisterConfirmation yalnızca test için kullanılır, bir üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.

Onaylanan bir hesap istemek ve kayıt sırasında hemen oturum açmayı engellemek için, DisplayConfirmAccountLink = false /Areas/ Identity /Pages/Account/RegisterConfirmation.cshtml.cs 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 zaman görüntülenir:

  • Oturum bağlantısı seçilidir.
  • Kullanıcı, erişim yetkisi olmayan veya sistem tarafından kimliği doğrulanmamış kısıtlı bir sayfaya erişmeye çalışır.

Oturum açma sayfasındaki form gönder geldiğinde OnPostAsync eylem çağrılır. PasswordSignInAsync nesnesi üzerinde _signInManager ç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ş .

Oturumun dışında

Oturumu bağlantısı eylemi LogoutModel.OnPost ç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();
            }
        }
    }
}

Önceki kodda, tarayıcının yeni bir istek gerçekleştiriyor ve kullanıcının kimliği güncelleştiriliyor olması için return RedirectToPage(); kodun yeniden yönlendirme olması gerekir.

SignOutAsync, kullanıcının içinde depolanan taleplerini cookie temizler.

Gönderi Pages/Shared/_LoginPartial.cshtml içinde belirtilir:

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

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

Test Identity

Varsayılan web projesi şablonları, giriş sayfalarına anonim erişim sağlar. Test etmek Identity için [Authorize] ekleyin:

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çmadıysanız, oturumdan çık. Uygulamayı çalıştırın ve bağlantıyı Privacy seçin. Oturum açma sayfasına yeniden yönlendirildiniz.

Keşfetmek Identity

Daha ayrıntılı Identity bir şekilde araştırmak için:

Identity Bileşen

Tüm Identity bağımlı NuGet paketleri, paylaşılan çerçeveye ASP.NET Core dahil edilir.

için birincil paket Identity Microsoft.AspNetCore'dır. Identity . Bu paket için temel arabirimler kümesi içerir ASP.NET Core Identity ve tarafından dahil Microsoft.AspNetCore.Identity.EntityFrameworkCore edilir.

'a ASP.NET Core Identity

Mevcut depolarınızı geçirme hakkında daha fazla bilgi ve rehberlik için Identity bkz. Kimlik Doğrulamasını Geçirme Identity ve .

Parola gücünü ayarlama

En düşük parola gereksinimlerini ayaran bir örnek için yapılandırmaya bakın.

AddDefault Identity ve EkleIdentity

AddDefaultIdentityASP.NET Core 2,1 ' de tanıtılmıştı. Çağırma AddDefaultIdentity , aşağıdakileri çağırmaya benzer:

Daha fazla bilgi için bkz. ADDDEFAULT Identity kaynağı .

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

Statik Identity varlıkların (Kullanıcı arabirimi için stil sayfaları ve JavaScript dosyaları Identity ) Web köküne yayımlanmasını engellemek için aşağıdaki ResolveStaticWebAssetsInputsDependsOn özelliği ve RemoveIdentityAssets hedefi uygulamanın proje 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

Gönderen Rick Anderson

ASP.NET Core Identity:

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

Kullanıcılar, içinde depolanan oturum açma bilgilerini içeren bir hesap oluşturabilir Identity veya bir dış oturum açma sağlayıcısı kullanabilirler. Desteklenen dış oturum açma sağlayıcıları Facebook, Google, Microsoft hesabı ve Twitteriçerir.

Tüm kullanıcıların kimliklerinin nasıl doğrulandığını öğrenmek için bkz. kimliği doğrulanmış kullanıcılar gerektirme.

Identity Kaynak kodu GitHub kullanılabilir. Yapı Identity İskelesi ve şablon etkileşimini gözden geçirmek için oluşturulan dosyaları görüntüleyin Identity .

Identitygenellikle kullanıcı adlarını, parolaları ve profil verilerini depolamak için bir SQL Server veritabanı kullanılarak yapılandırılır. alternatif olarak, başka bir kalıcı mağaza da kullanılabilir, örneğin Azure tablosu Depolama.

Bu konu başlığında, Identity bir kullanıcıyı kaydetmek, oturum açmak ve oturumu kapatmak için kullanmayı öğreneceksiniz. Note: Şablonlar Kullanıcı adı ve e-postayı kullanıcılar için aynı olarak değerlendirir. Kullanan uygulamaları oluşturma hakkında daha ayrıntılı yönergeler için Identity bkz. sonraki adımlar.

Microsoft kimlik platformu :

  • Azure Active Directory (Azure AD) geliştirici platformunun bir evrimi.
  • İlgisiz ASP.NET Core Identity .

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

IdentityServer4, bir OpenID Bağlan ve OAuth 2.0 çerçevesidir ASP.NET Core. IdentityServer4 aşağıdaki güvenlik özelliklerini sağlar:

  • 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. Identity Server4'e Hoş Geldiniz.

Örnek kodu (indirme) görüntüleyin veya indirin .

Kimlik doğrulamasıyla bir Web uygulaması oluşturma

bireysel kullanıcı hesaplarıyla bir ASP.NET Core Web uygulaması projesi oluşturun.

  • dosya > yeni > Project seçin.
  • ASP.NET Core Web uygulaması' nı seçin. Projeyi Proje WebApp1 aynı ad alanına sahip olacak şekilde adlandırın. Tamam'a tıklayın.
  • bir ASP.NET Core Web uygulaması seçip kimlik doğrulamasını değiştir' i seçin.
  • Bireysel kullanıcı hesapları ' nı seçip Tamam' a tıklayın.

Oluşturulan proje ASP.NET Core Identity bir Razor sınıf kitaplığıolarak sağlanır. Identity Razor Sınıf kitaplığı, alanı ile uç noktaları kullanıma sunar Identity . Örnek:

  • /Identity/Account/Login
  • /Identity/Account/Logout
  • /Identity/Account/Manage

Geçişleri Uygula

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

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

PM> Update-Database

Test kaydı ve oturum açma

Uygulamayı çalıştırın ve bir Kullanıcı kaydedin. Ekran boyutunuza bağlı olarak, kayıt ve oturum açma bağlantılarını görmek için gezinti geçiş düğmesini seçmeniz gerekebilir.

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

  • Görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini seçin.
  • (LocalDB) MSSQLLocalDB (SQL Server 13) öğesine gidin. Dbo üzerinde sağ tıklayın . Aspnetusers > verileri görüntüle:

SQL Server Nesne Gezgini 'de AspNetUsers tablosundaki bağlamsal menü

IdentityHizmetleri yapılandırma

Hizmetler ' de eklenir ConfigureServices . Tipik model, tüm yöntemleri çağırmalıdır Add{Service} ve sonra tüm services.Configure{Service} yöntemleri çağırı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 varsayılan seçenek değerleriyle yapılandırılır. Hizmetler, bağımlılık eklemeyoluyla uygulama için kullanılabilir hale getirilir.

Identity çağırarak etkindir UseAuthentication . UseAuthentication istek ardışık düzenine 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;
    });
}

Önceki kod Identity varsayılan seçenek değerleriyle yapılandırılır. Hizmetler, bağımlılık eklemeyoluyla uygulama için kullanılabilir hale getirilir.

IdentityUseAuthenticationçağırarak etkinleştirilir. UseAuthentication istek ardışık düzenine 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 Yetkilendirmekullanmaz. app.UseAuthorization , uygulamanın yetkilendirme eklemesi için doğru sırada eklendiğinden emin olmak için dahil edilmiştir. UseRouting, UseAuthentication , UseAuthorization ve UseEndpoints Önceki kodda gösterilen sırada çağrılmalıdır.

Ve hakkında daha fazla bilgi için IdentityOptions Startup , bkz IdentityOptions . ve uygulama başlatma.

Scafkatlama kaydı, oturum açma, oturum kapatma ve RegisterConfirmation

,, Register Login LogOut Ve RegisterConfirmation dosyalarını ekleyin. Bu bölümde gösterilen kodu oluşturmak için, Yetkilendirme talimatlarına Razor sahip bir projede Scaffold kimliğini izleyin.

Kaydı İncele

Bir kullanıcı sayfadaki Kaydet düğmesine tıkladığında Register RegisterModel.OnPostAsync eylem çağrılır. Kullanıcı, nesnesi üzerinde Createasync tarafından oluşturulmuştur _userManager :

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ğrulamasını devre dışı bırak

Varsayılan Şablonlar ile Kullanıcı, Account.RegisterConfirmation hesabın onaylandığı bir bağlantı seçtikleri yere yönlendirilir. Varsayılan değer Account.RegisterConfirmation yalnızca test için kullanılır, bir üretim uygulamasında otomatik hesap doğrulaması devre dışı bırakılmalıdır.

Onaylanan bir hesap istemek ve kayıt sırasında hemen oturum açmayı engellemek için, DisplayConfirmAccountLink = false /Areas/ Identity /Pages/Account/RegisterConfirmation.cshtml.cs 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ı, erişim yetkisi olmayan veya sistem tarafından kimliği doğrulanmamış olan sınırlı bir sayfaya erişmeyi dener.

Oturum açma sayfasındaki form gönderildiğinde, OnPostAsync eylem çağrılır. PasswordSignInAsync , nesne üzerinde ç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ının nasıl yapılacağı hakkında bilgi için bkz ASP.NET Core'da yetkilendirmeye giriş ..

Oturumu Kapat

Oturumu kapatma bağlantısı LogoutModel.OnPost 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();
            }
        }
    }
}

Önceki kodda, return RedirectToPage(); tarayıcının yeni bir istek gerçekleştirmesini ve Kullanıcı kimliğinin güncelleştirilmesini sağlamak için kodun yeniden yönlendirme olması gerekir.

Signoutasync , kullanıcının bir içinde depolanan taleplerini temizler cookie .

Sayfa/paylaşılan/_LoginPartial. cshtml'de gönderi belirtildi:

@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>

Sınamanız Identity

Varsayılan Web projesi şablonları, giriş sayfalarına anonim erişime izin verir. Test etmek için şunları Identity 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()
        {
        }
    }
}

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

Explorer Identity

IdentityDaha ayrıntılı incelemek için:

Identity Bileşenleri

tüm Identity bağımlı NuGet paketleri, ASP.NET Core paylaşılan çerçevesinedahildir.

İçin birincil paket Identity Microsoft. aspnetcore Identity ... Bu paket, için temel arabirim kümesini içerir ASP.NET Core Identity ve tarafından dahildir Microsoft.AspNetCore.Identity.EntityFrameworkCore .

Geçiş yapılıyor ASP.NET Core Identity

Mevcut deponuzu geçirme hakkında daha fazla bilgi ve yönergeler için Identity bkz. geçiş kimlik Identity doğrulaması ve .

Parola gücünü ayarlama

Minimum parola gereksinimlerini ayarlayan bir örnek için bkz. yapılandırma .

AddDefault Identity ve EkleIdentity

AddDefaultIdentityASP.NET Core 2,1 ' de tanıtılmıştı. Çağırma AddDefaultIdentity , aşağıdakileri çağırmaya benzer:

Daha fazla bilgi için bkz. ADDDEFAULT Identity kaynağı .

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

Statik Identity varlıkların (Kullanıcı arabirimi için stil sayfaları ve JavaScript dosyaları Identity ) Web köküne yayımlanmasını engellemek için aşağıdaki ResolveStaticWebAssetsInputsDependsOn özelliği ve RemoveIdentityAssets hedefi uygulamanın proje 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