Aracılığıyla paylaş


ASP.NET Core olmadan kimlik doğrulamayı kullanma cookieIdentity

Gönderen Rick Anderson

ASP.NET Core Identity , oturum açma bilgileri oluşturmaya ve sürdürmeye yönelik eksiksiz ve tam özellikli bir kimlik doğrulama sağlayıcısıdır. Ancak, ASP.NET Core Identity içermeyen tabanlı bir cookiekimlik doğrulama sağlayıcısı kullanılabilir. Daha fazla bilgi için bkz. ASP.NET Core'a Identitygiriş.

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

Örnek uygulamada gösterim amacıyla, maria Rodriguez adlı varsayımsal kullanıcının kullanıcı hesabı uygulamaya sabit kodlanmıştır. Kullanıcıda oturum açmak için E-posta adresini maria.rodriguez@contoso.com ve herhangi bir parolayı kullanın. Kullanıcının kimliği dosyasındaki AuthenticateUser yönteminde Pages/Account/Login.cshtml.cs doğrulanır. Gerçek dünyadaki bir örnekte, kullanıcının kimliği bir veri deposunda doğrulanır.

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

builder.Services.AddHttpContextAccessor();

var app = builder.Build();

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

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

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

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

AuthenticationScheme geçirildi AddAuthentication ayarı, uygulama için varsayılan kimlik doğrulama düzenini ayarlar. AuthenticationSchemebirden çok kimlik doğrulaması örneği cookie olduğunda ve uygulamanın belirli bir şemayla yetkilendirmesi gerektiğinde kullanışlıdır. AuthenticationScheme cookieAuthenticationDefaults.AuthenticationScheme olarak ayarlanması şema için değerini "Cookies" sağlar. Düzeni ayırt eden herhangi bir dize değeri kullanılabilir.

Uygulamanın kimlik doğrulama düzeni, uygulamanın cookie kimlik doğrulama düzeninden farklıdır. için bir cookie kimlik doğrulama düzeni sağlanmazsa AddCookiekullanır CookieAuthenticationDefaults.AuthenticationScheme. CookieAuthenticationDefaults.AuthenticationScheme GitHub Kaynağı olarak ayarlandığını "Cookies"gösterir.

Kimlik doğrulamasının cookieIsEssential özelliği varsayılan olarak olarak true ayarlanır. Site ziyaretçisi veri toplamaya onay vermediğinde kimlik doğrulama tanımlama bilgilerine izin verilir. Daha fazla bilgi için bkz . ASP.NET Core'da Genel Veri Koruma Yönetmeliği (GDPR) desteği.

CookieAuthenticationOptions sınıfı, kimlik doğrulama sağlayıcısı seçeneklerini yapılandırmak için kullanılır.

yönteminde AddCookie yapılandırınCookieAuthenticationOptions:

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
        options.SlidingExpiration = true;
        options.AccessDeniedPath = "/Forbidden/";
    });

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

var app = builder.Build();

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

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

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

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

İlke Ara Yazılımı (GitHub Kaynağı), UseCookiePolicy ilke özelliklerini etkinleştirircookie.Cookie Ara yazılım, eklenme sırasına göre işlenir:

app.UseCookiePolicy(cookiePolicyOptions);

İşlemenin genel özelliklerini cookie denetlemek ve tanımlama bilgileri eklendiğinde veya silindiğinde işleme işleyicilerine bağlanmak için İlke cookie Ara Yazılımı'na sağlananları kullanınCookiePolicyOptions.Cookie

Varsayılan MinimumSameSitePolicy değer, OAuth2 kimlik doğrulamasına izin vermektir SameSiteMode.Lax . öğesinin aynı site ilkesini SameSiteMode.Strictkesinlikle zorunlu kılmak için değerini MinimumSameSitePolicyayarlayın. Bu ayar OAuth2 ve diğer çıkış noktaları arası kimlik doğrulama düzenlerini bozsa da, çıkış noktaları arası istek işlemeye dayanmayan diğer uygulama türleri için güvenlik düzeyini cookie yükseltir.

var cookiePolicyOptions = new CookiePolicyOptions
{
    MinimumSameSitePolicy = SameSiteMode.Strict,
};

Cookie için MinimumSameSitePolicy İlke Ara Yazılımı ayarı, ayarların ayarını Cookie.SameSite CookieAuthenticationOptions aşağıdaki matrise göre etkileyebilir.

MinimumSameSitePolicy Cookie. SameSite CookieSonuç. SameSite ayarı
SameSiteMode.None SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict

Tutma kullanıcı bilgileri oluşturmak cookie için bir ClaimsPrincipaloluşturun. Kullanıcı bilgileri serileştirilir ve içinde cookiedepolanır.

Gerekli Claims ile bir ClaimsIdentity oluşturun ve kullanıcıda oturum açmak için arayınSignInAsync. Login.cshtml.cs örnek uygulamada aşağıdaki kodu içerir:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    ReturnUrl = returnUrl;

    if (ModelState.IsValid)
    {
        // Use Input.Email and Input.Password to authenticate the user
        // with your custom authentication logic.
        //
        // For demonstration purposes, the sample validates the user
        // on the email address maria.rodriguez@contoso.com with 
        // any password that passes model validation.

        var user = await AuthenticateUser(Input.Email, Input.Password);

        if (user == null)
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, user.Email),
            new Claim("FullName", user.FullName),
            new Claim(ClaimTypes.Role, "Administrator"),
        };

        var claimsIdentity = new ClaimsIdentity(
            claims, CookieAuthenticationDefaults.AuthenticationScheme);

        var authProperties = new AuthenticationProperties
        {
            //AllowRefresh = <bool>,
            // Refreshing the authentication session should be allowed.

            //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
            // The time at which the authentication ticket expires. A 
            // value set here overrides the ExpireTimeSpan option of 
            // CookieAuthenticationOptions set with AddCookie.

            //IsPersistent = true,
            // Whether the authentication session is persisted across 
            // multiple requests. When used with cookies, controls
            // whether the cookie's lifetime is absolute (matching the
            // lifetime of the authentication ticket) or session-based.

            //IssuedUtc = <DateTimeOffset>,
            // The time at which the authentication ticket was issued.

            //RedirectUri = <string>
            // The full path or absolute URI to be used as an http 
            // redirect response value.
        };

        await HttpContext.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme, 
            new ClaimsPrincipal(claimsIdentity), 
            authProperties);

        _logger.LogInformation("User {Email} logged in at {Time}.", 
            user.Email, DateTime.UtcNow);

        return LocalRedirect(Url.GetLocalUrl(returnUrl));
    }

    // Something failed. Redisplay the form.
    return Page();
}

Kod açıklamalarının İngilizce dışındaki dillere çevirisini görmek isterseniz, bunu bu GitHub tartışma konusunda bize bildirin.

SignInAsync şifrelenmiş cookie bir oluşturur ve bunu geçerli yanıta ekler. Belirtilmezse AuthenticationScheme , varsayılan düzen kullanılır.

RedirectUri varsayılan olarak yalnızca birkaç belirli yolda kullanılır, örneğin oturum açma yolu ve oturum kapatma yolları. Daha fazla bilgi için bkz . CookieAuthenticationHandler kaynağı.

ASP.NET Core'un Veri Koruma sistemi şifreleme için kullanılır. Birden çok makinede barındırılan bir uygulama için, uygulamalar arasında yük dengeleme veya bir web grubu kullanmak için veri korumasını aynı anahtar halkasını ve uygulama tanımlayıcısını kullanacak şekilde yapılandırın.

Oturumu kapat

Geçerli kullanıcıyı oturumu kapatmak ve silmek cookieiçin öğesini çağırın SignOutAsync:

public async Task OnGetAsync(string returnUrl = null)
{
    if (!string.IsNullOrEmpty(ErrorMessage))
    {
        ModelState.AddModelError(string.Empty, ErrorMessage);
    }

    // Clear the existing external cookie
    await HttpContext.SignOutAsync(
        CookieAuthenticationDefaults.AuthenticationScheme);

    ReturnUrl = returnUrl;
}

Şema olarak veya "Tanımlama Bilgileri" kullanılmıyorsaCookieAuthenticationDefaults.AuthenticationScheme, kimlik doğrulama sağlayıcısını yapılandırırken kullanılan düzeni sağlayın. Aksi takdirde, varsayılan düzen kullanılır. Örneğin, düzen olarak "ContosoCookie" kullanılıyorsa, kimlik doğrulama sağlayıcısını yapılandırırken kullanılan düzeni sağlayın.

Tarayıcı kapatıldığında oturum tabanlı tanımlama bilgileri (kalıcı olmayan tanımlama bilgileri) otomatik olarak silinir, ancak tek bir sekme kapatıldığında hiçbir tanımlama bilgisi temizilmez. Sunucuya sekme veya tarayıcı kapatma olayları bildirilir.

Arka uç değişikliklerine tepki verme

oluşturulduktan cookie sonra, cookie tek kaynağıdır identity. Bir kullanıcı hesabı arka uç sistemlerinde devre dışı bırakıldıysa:

  • Uygulamanın cookie kimlik doğrulama sistemi, kimlik doğrulamasına cookiegöre istekleri işlemeye devam eder.
  • Kimlik doğrulaması cookie geçerli olduğu sürece kullanıcı uygulamada oturum açmış durumda kalır.

Olay, ValidatePrincipal öğesinin cookieidentitydoğrulamasını kesmek ve geçersiz kılmak için kullanılabilir. her istekte öğesinin doğrulanmış olarak cookie etkinleştirilmesi, kullanıcıların uygulamaya erişimini iptal etme riskini azaltır.

Doğrulamaya cookie yönelik bir yaklaşım, kullanıcı veritabanının ne zaman değiştiğini izlemeye dayanır. Kullanıcının verileri verildiğinden bu yana cookie veritabanı değiştirilmediyse, kullanıcı hala geçerliyse cookie kullanıcının kimliğini yeniden doğrulamaya gerek yoktur. Örnek uygulamada veritabanı içinde IUserRepository uygulanır ve bir LastChanged değer depolar. Veritabanında bir kullanıcı güncelleştirildiğinde, LastChanged değer geçerli saate ayarlanır.

Veritabanı değere göre değiştiğinde değerini cookie geçersiz kılması için veritabanındaki geçerli LastChanged değeri içeren bir LastChanged taleple oluşturuncookie:LastChanged

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("LastChanged", {Database Value})
};

var claimsIdentity = new ClaimsIdentity(
    claims,
    CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity));

Olay için geçersiz kılma uygulamak için ValidatePrincipal , öğesinden CookieAuthenticationEventstüretilen bir sınıfta aşağıdaki imzaya sahip bir yöntem yazın:

ValidatePrincipal(CookieValidatePrincipalContext)

Aşağıda örnek bir uygulaması verilmiştir CookieAuthenticationEvents:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        var userPrincipal = context.Principal;

        // Look for the LastChanged claim.
        var lastChanged = (from c in userPrincipal.Claims
                           where c.Type == "LastChanged"
                           select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !_userRepository.ValidateLastChanged(lastChanged))
        {
            context.RejectPrincipal();

            await context.HttpContext.SignOutAsync(
                CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
}

Hizmet kaydı sırasında cookie olay örneğini kaydedin. Sınıfınız CustomCookieAuthenticationEvents için kapsamlı bir hizmet kaydı sağlayın:

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.EventsType = typeof(CustomCookieAuthenticationEvents);
    });

builder.Services.AddScoped<CustomCookieAuthenticationEvents>();

var app = builder.Build();

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

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

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

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

Kullanıcının adının güncelleştirildiği bir durumu( güvenliği hiçbir şekilde etkilemeyen bir karar) düşünün. Kullanıcı sorumlusunu yıkıcı olmayan bir şekilde güncelleştirmek istiyorsanız, öğesini çağırın context.ReplacePrincipal context.ShouldRenew ve özelliğini olarak trueayarlayın.

Uyarı

Burada açıklanan yaklaşım her istekte tetikleniyor. Her istekte tüm kullanıcılar için kimlik doğrulama tanımlama bilgilerinin doğrulanıyorsa uygulama için büyük bir performans cezası oluşabilir.

Kalıcı tanımlama bilgileri

tarayıcı oturumlarında kalıcı olmasını isteyebilirsiniz cookie . Bu kalıcılık yalnızca oturum açmada "Beni Anımsa" onay kutusu veya benzer bir mekanizma ile açık kullanıcı onayıyla etkinleştirilmelidir.

Aşağıdaki kod parçacığı, tarayıcı kapanışları aracılığıyla devam eden ve karşılık gelen cookie bir identity kod parçacığı oluşturur. Daha önce yapılandırılmış kayan süre sonu ayarları kabul edilir. cookie Tarayıcı kapatılırken süresi dolarsa, tarayıcı yeniden başlatıldıktan sonra tarayıcıyı cookie temizler.

içinde AuthenticationPropertiesolarak true ayarlayınIsPersistent:

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true
    });

ile ExpiresUtcmutlak süre sonu ayarlanabilir. Kalıcı cookieIsPersistent bir oluşturmak için de ayarlanmalıdır. Aksi takdirde, cookie oturum tabanlı bir yaşam süresiyle oluşturulur ve sahip olduğu kimlik doğrulama biletinden önce veya sonra süresi dolabilir. ExpiresUtc Ayarlandığında, ayarlanırsa seçeneğinin ExpireTimeSpan CookieAuthenticationOptionsdeğerini geçersiz kılar.

Aşağıdaki kod parçacığı, 20 dakika süren ve buna karşılık gelen cookie bir identity kod parçacığı oluşturur. Bu, daha önce yapılandırılmış kayan süre sonu ayarlarını yoksayar.

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });

ASP.NET Core Identity , oturum açma bilgileri oluşturmaya ve sürdürmeye yönelik eksiksiz ve tam özellikli bir kimlik doğrulama sağlayıcısıdır. Ancak, ASP.NET Core Identity içermeyen tabanlı bir cookiekimlik doğrulama sağlayıcısı kullanılabilir. Daha fazla bilgi için bkz. ASP.NET Core'a Identitygiriş.

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

Örnek uygulamada gösterim amacıyla, maria Rodriguez adlı varsayımsal kullanıcının kullanıcı hesabı uygulamaya sabit kodlanmıştır. Kullanıcıda oturum açmak için E-posta adresini maria.rodriguez@contoso.com ve herhangi bir parolayı kullanın. Kullanıcının kimliği dosyasındaki AuthenticateUser yönteminde Pages/Account/Login.cshtml.cs doğrulanır. Gerçek dünyadaki bir örnekte kullanıcının kimliği bir veritabanında doğrulanır.

Yapılandırma

yönteminde Startup.ConfigureServices ve AddCookie yöntemleriyle AddAuthentication Kimlik Doğrulama Ara Yazılımı hizmetlerini oluşturun:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

AuthenticationScheme geçirildi AddAuthentication ayarı, uygulama için varsayılan kimlik doğrulama düzenini ayarlar. AuthenticationSchemebirden çok kimlik doğrulaması örneği cookie olduğunda ve belirli bir şemayla yetkilendirmek istediğinizde kullanışlıdır. AuthenticationScheme cookieAuthenticationDefaults.AuthenticationScheme ayarı, şema için "Tanımlama Bilgileri" değeri sağlar. Düzeni ayırt eden herhangi bir dize değeri sağlayabilirsiniz.

Uygulamanın kimlik doğrulama düzeni, uygulamanın cookie kimlik doğrulama düzeninden farklıdır. için bir cookie kimlik doğrulama düzeni sağlanmazsa AddCookie("Tanımlama Bilgileri") kullanılır CookieAuthenticationDefaults.AuthenticationScheme .

Kimlik doğrulamasının cookieIsEssential özelliği varsayılan olarak olarak true ayarlanır. Site ziyaretçisi veri toplamaya onay vermediğinde kimlik doğrulama tanımlama bilgilerine izin verilir. Daha fazla bilgi için bkz . ASP.NET Core'da Genel Veri Koruma Yönetmeliği (GDPR) desteği.

içindeStartup.Configure, özelliğini ayarlamak ve UseAuthorization istekler için Yetkilendirme Ara Yazılımı'nı HttpContext.User çalıştırmak için ve öğesini çağırınUseAuthentication. UseAuthentication çağrısından önce ve UseAuthorization yöntemlerini çağırınUseEndpoints:

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

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

CookieAuthenticationOptions sınıfı, kimlik doğrulama sağlayıcısı seçeneklerini yapılandırmak için kullanılır.

yönteminde kimlik doğrulaması için hizmet yapılandırmasında Startup.ConfigureServices ayarlayınCookieAuthenticationOptions:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        ...
    });

Cookie İlke Ara Yazılımı , ilke özelliklerini etkinleştirir cookie . Ara yazılımı uygulama işleme işlem hattına eklemek siparişe duyarlıdır; yalnızca işlem hattında kayıtlı aşağı akış bileşenlerini etkiler.

app.UseCookiePolicy(cookiePolicyOptions);

İşlemenin genel özelliklerini cookie denetlemek ve tanımlama bilgileri eklendiğinde veya silindiğinde işleme işleyicilerine bağlanmak için İlke cookie Ara Yazılımı'na sağlananları kullanınCookiePolicyOptions.Cookie

Varsayılan MinimumSameSitePolicy değer, OAuth2 kimlik doğrulamasına izin vermektir SameSiteMode.Lax . öğesinin aynı site ilkesini SameSiteMode.Strictkesinlikle zorunlu kılmak için değerini MinimumSameSitePolicyayarlayın. Bu ayar OAuth2 ve diğer çıkış noktaları arası kimlik doğrulama düzenlerini bozsa da, çıkış noktaları arası istek işlemeye dayanmayan diğer uygulama türleri için güvenlik düzeyini cookie yükseltir.

var cookiePolicyOptions = new CookiePolicyOptions
{
    MinimumSameSitePolicy = SameSiteMode.Strict,
};

Cookie için MinimumSameSitePolicy İlke Ara Yazılımı ayarı, ayarların ayarını Cookie.SameSite CookieAuthenticationOptions aşağıdaki matrise göre etkileyebilir.

MinimumSameSitePolicy Cookie. SameSite CookieSonuç. SameSite ayarı
SameSiteMode.None SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict

Tutma kullanıcı bilgileri oluşturmak cookie için bir ClaimsPrincipaloluşturun. Kullanıcı bilgileri serileştirilir ve içinde cookiedepolanır.

Gerekli Claims ile bir ClaimsIdentity oluşturun ve kullanıcı oturum açmak için çağrısıSignInAsync:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

var claimsIdentity = new ClaimsIdentity(
    claims, CookieAuthenticationDefaults.AuthenticationScheme);

var authProperties = new AuthenticationProperties
{
    //AllowRefresh = <bool>,
    // Refreshing the authentication session should be allowed.

    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
    // The time at which the authentication ticket expires. A 
    // value set here overrides the ExpireTimeSpan option of 
    // CookieAuthenticationOptions set with AddCookie.

    //IsPersistent = true,
    // Whether the authentication session is persisted across 
    // multiple requests. When used with cookies, controls
    // whether the cookie's lifetime is absolute (matching the
    // lifetime of the authentication ticket) or session-based.

    //IssuedUtc = <DateTimeOffset>,
    // The time at which the authentication ticket was issued.

    //RedirectUri = <string>
    // The full path or absolute URI to be used as an http 
    // redirect response value.
};

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity), 
    authProperties);

Kod açıklamalarının İngilizce dışındaki dillere çevirisini görmek isterseniz, bunu bu GitHub tartışma konusunda bize bildirin.

SignInAsync şifrelenmiş cookie bir oluşturur ve bunu geçerli yanıta ekler. Belirtilmezse AuthenticationScheme , varsayılan düzen kullanılır.

RedirectUri varsayılan olarak yalnızca birkaç belirli yolda kullanılır, örneğin oturum açma yolu ve oturum kapatma yolları. Daha fazla bilgi için bkz . CookieAuthenticationHandler kaynağı.

ASP.NET Core'un Veri Koruma sistemi şifreleme için kullanılır. Birden çok makinede barındırılan bir uygulama için, uygulamalar arasında yük dengeleme veya bir web grubu kullanmak için veri korumasını aynı anahtar halkasını ve uygulama tanımlayıcısını kullanacak şekilde yapılandırın.

Oturumu kapat

Geçerli kullanıcıyı oturumu kapatmak ve silmek cookieiçin öğesini çağırın SignOutAsync:

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

Şema olarak (veya "Tanımlama Bilgileri") kullanılmıyorsa CookieAuthenticationDefaults.AuthenticationScheme (örneğin, "ContosoCookie"), kimlik doğrulama sağlayıcısını yapılandırırken kullanılan düzeni sağlayın. Aksi takdirde, varsayılan düzen kullanılır.

Tarayıcı kapatıldığında oturum tabanlı tanımlama bilgileri (kalıcı olmayan tanımlama bilgileri) otomatik olarak silinir, ancak tek bir sekme kapatıldığında hiçbir tanımlama bilgisi temizilmez. Sunucuya sekme veya tarayıcı kapatma olayları bildirilir.

Arka uç değişikliklerine tepki verme

oluşturulduktan cookie sonra, cookie tek kaynağıdır identity. Bir kullanıcı hesabı arka uç sistemlerinde devre dışı bırakıldıysa:

  • Uygulamanın cookie kimlik doğrulama sistemi, kimlik doğrulamasına cookiegöre istekleri işlemeye devam eder.
  • Kimlik doğrulaması cookie geçerli olduğu sürece kullanıcı uygulamada oturum açmış durumda kalır.

Olay, ValidatePrincipal öğesinin cookieidentitydoğrulamasını kesmek ve geçersiz kılmak için kullanılabilir. her istekte öğesinin doğrulanmış olarak cookie etkinleştirilmesi, kullanıcıların uygulamaya erişimini iptal etme riskini azaltır.

Doğrulamaya cookie yönelik bir yaklaşım, kullanıcı veritabanının ne zaman değiştiğini izlemeye dayanır. Kullanıcının verileri verildiğinden bu yana cookie veritabanı değiştirilmediyse, kullanıcı hala geçerliyse cookie kullanıcının kimliğini yeniden doğrulamaya gerek yoktur. Örnek uygulamada veritabanı içinde IUserRepository uygulanır ve bir LastChanged değer depolar. Veritabanında bir kullanıcı güncelleştirildiğinde, LastChanged değer geçerli saate ayarlanır.

Veritabanı değere göre değiştiğinde değerini cookie geçersiz kılması için veritabanındaki geçerli LastChanged değeri içeren bir LastChanged taleple oluşturuncookie:LastChanged

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("LastChanged", {Database Value})
};

var claimsIdentity = new ClaimsIdentity(
    claims, 
    CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity));

Olay için geçersiz kılma uygulamak için ValidatePrincipal , öğesinden CookieAuthenticationEventstüretilen bir sınıfta aşağıdaki imzaya sahip bir yöntem yazın:

ValidatePrincipal(CookieValidatePrincipalContext)

Aşağıda örnek bir uygulaması verilmiştir CookieAuthenticationEvents:

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        // Get the database from registered DI services.
        _userRepository = userRepository;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        var userPrincipal = context.Principal;

        // Look for the LastChanged claim.
        var lastChanged = (from c in userPrincipal.Claims
                           where c.Type == "LastChanged"
                           select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !_userRepository.ValidateLastChanged(lastChanged))
        {
            context.RejectPrincipal();

            await context.HttpContext.SignOutAsync(
                CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
}

yönteminde hizmet kaydı sırasında cookie olay örneğini Startup.ConfigureServices kaydedin. Sınıfınız CustomCookieAuthenticationEvents için kapsamlı bir hizmet kaydı sağlayın:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.EventsType = typeof(CustomCookieAuthenticationEvents);
    });

services.AddScoped<CustomCookieAuthenticationEvents>();

Kullanıcının adının güncelleştirildiği bir durumu( güvenliği hiçbir şekilde etkilemeyen bir karar) düşünün. Kullanıcı sorumlusunu yıkıcı olmayan bir şekilde güncelleştirmek istiyorsanız, öğesini çağırın context.ReplacePrincipal context.ShouldRenew ve özelliğini olarak trueayarlayın.

Uyarı

Burada açıklanan yaklaşım her istekte tetikleniyor. Her istekte tüm kullanıcılar için kimlik doğrulama tanımlama bilgilerinin doğrulanıyorsa uygulama için büyük bir performans cezası oluşabilir.

Kalıcı tanımlama bilgileri

tarayıcı oturumlarında kalıcı olmasını isteyebilirsiniz cookie . Bu kalıcılık yalnızca oturum açmada "Beni Anımsa" onay kutusu veya benzer bir mekanizma ile açık kullanıcı onayıyla etkinleştirilmelidir.

Aşağıdaki kod parçacığı, tarayıcı kapanışları aracılığıyla devam eden ve karşılık gelen cookie bir identity kod parçacığı oluşturur. Daha önce yapılandırılmış kayan süre sonu ayarları kabul edilir. cookie Tarayıcı kapatılırken süresi dolarsa, tarayıcı yeniden başlatıldıktan sonra tarayıcıyı cookie temizler.

içinde AuthenticationPropertiesolarak true ayarlayınIsPersistent:

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true
    });

ile ExpiresUtcmutlak süre sonu ayarlanabilir. Kalıcı cookieIsPersistent bir oluşturmak için de ayarlanmalıdır. Aksi takdirde, cookie oturum tabanlı bir yaşam süresiyle oluşturulur ve sahip olduğu kimlik doğrulama biletinden önce veya sonra süresi dolabilir. ExpiresUtc Ayarlandığında, ayarlanırsa seçeneğinin ExpireTimeSpan CookieAuthenticationOptionsdeğerini geçersiz kılar.

Aşağıdaki kod parçacığı, 20 dakika süren ve buna karşılık gelen cookie bir identity kod parçacığı oluşturur. Bu, daha önce yapılandırılmış kayan süre sonu ayarlarını yoksayar.

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });