Asp.NET Core Identity – Oturum Kapatma – XIII

Merhaba,

Asp.NET Core Identity yazı dizisinde sıra oturum kapatma işlemini ele almaya geldi. Uygulamada oturum açmış olan kullanıcıların oturumlarından çıkış yapabilmesi için nasıl bir işlem gerçekleştireceğimizi inceleyeceğiz.

Kullanıcının, nasıl ki giriş yaptığında süreci SignInManager nesnesiyle kontrol ediyorsak benzer mantıkla çıkış yapabilmesi içinde yine aynı nesneyi kullanacağız.

    public class UserController : Controller
    {
        readonly UserManager<AppUser> _userManager;
        readonly SignInManager<AppUser> _signInManager;
        public UserController(UserManager<AppUser> userManager, SignInManager<AppUser> signInManager)
        {
            _userManager = userManager;
            _signInManager = signInManager;
        }
        public async Task<IActionResult> Logout()
        {
            await _signInManager.SignOutAsync();
            return RedirectToAction("Index");
        }
    .
    .
    .
    //diğer actionlar
    .
    .
    .
    }

Yukarıdaki kod bloğunu incelerseniz eğer “Logout” action metodu içerisinde 12. satırda “SignOutAsync” metodu ile kullanıcının oturumu düşürülmektedir ve ardından “Index” actionına yönlendirme gerçekleştirilmektedir. Bu yöntem iki oturum düşürme senaryolarından birisidir. Diğeri ise Asp.NET Core MVC mimarisindeki Tag Helper yapılanmasının bizlere getirmiş olduğu bir başka nimettir.

    public class UserController : Controller
    {
        readonly UserManager<AppUser> _userManager;
        readonly SignInManager<AppUser> _signInManager;
        public UserController(UserManager<AppUser> userManager, SignInManager<AppUser> signInManager)
        {
            _userManager = userManager;
            _signInManager = signInManager;
        }
        public async Task Logout()
        {
            await _signInManager.SignOutAsync();
        }
    .
    .
    .
    //diğer actionlar
    .
    .
    .
    }

Yukarıdaki kod bloğunu incelerseniz eğer “Logout” actionı geriye değer döndürmeyen metot haline getirilerek, “SignOutAsync” metodu neticesinde herhangi bir sayfaya yapılan yönlendirme kaldırılmıştır.
Peki çıkış yapıldıktan sonra nasıl yönlendirme yapacağız? sorusuna karşılık ise bir paragraf önce bahsettiğim tag helper yapılanmasını cevap olarak sunacağım.

“Logout” actionına link verdiğimiz sayfada “asp-route-returnUrl” tag helperını aşağıdaki gibi kullanarak, bu link üzerinden istek yapıldığı taktirde neticede hangi adrese yönlendirileceğini belirlemiş bulunmaktayız.

<a asp-action="Logout" asp-controller="User" asp-route-returnUrl="/User/Signin">Logout</a>

Lakin ilgili tag helperın kullanılabilmesi için “Startup.cs” dosyasında uygulamaya dair cookie konfigürasyonunu sağladığımız “ConfigureApplicationCookie” metodunda aşağıdaki kod bloğunda 26. satırda olduğu gibi “LogoutPath” özelliğine hangi action tetiklendiğinde çalışacağını belirlememiz gerekmektedir.

    public class Startup
    {
        public IConfiguration Configuration { get; set; }
        public Startup(IConfiguration configuration) => Configuration = configuration;
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AppDbContext>(_ => _.UseSqlServer(Configuration["ConnectionStrings:SqlServerConnectionString"]));
            services.AddIdentity<AppUser, AppRole>(_ =>
            {
                _.Password.RequiredLength = 5; //En az kaç karakterli olması gerektiğini belirtiyoruz.
                _.Password.RequireNonAlphanumeric = false; //Alfanumerik zorunluluğunu kaldırıyoruz.
                _.Password.RequireLowercase = false; //Küçük harf zorunluluğunu kaldırıyoruz.
                _.Password.RequireUppercase = false; //Büyük harf zorunluluğunu kaldırıyoruz.
                _.Password.RequireDigit = false; //0-9 arası sayısal karakter zorunluluğunu kaldırıyoruz.

                _.User.RequireUniqueEmail = true; //Email adreslerini tekilleştiriyoruz.
                _.User.AllowedUserNameCharacters = "abcçdefghiıjklmnoöpqrsştuüvwxyzABCÇDEFGHIİJKLMNOÖPQRSŞTUÜVWXYZ0123456789-._@+"; //Kullanıcı adında geçerli olan karakterleri belirtiyoruz.
            }).AddPasswordValidator<CustomPasswordValidation>()
              .AddUserValidator<CustomUserValidation>()
              .AddErrorDescriber<CustomIdentityErrorDescriber>().AddEntityFrameworkStores<AppDbContext>()
              .AddDefaultTokenProviders(); ;

            services.ConfigureApplicationCookie(_ =>
            {
                _.LoginPath = new PathString("/User/Login");
                _.LogoutPath = new PathString("/User/Logout");
                _.Cookie = new CookieBuilder
                {
                    Name = "AspNetCoreIdentityExampleCookie", //Oluşturulacak Cookie'yi isimlendiriyoruz.
                    HttpOnly = false, //Kötü niyetli insanların client-side tarafından Cookie'ye erişmesini engelliyoruz.
                    Expiration = TimeSpan.FromMinutes(2), //Oluşturulacak Cookie'nin vadesini belirliyoruz.
                    SameSite = SameSiteMode.Lax, //Top level navigasyonlara sebep olmayan requestlere Cookie'nin gönderilmemesini belirtiyoruz.
                    SecurePolicy = CookieSecurePolicy.Always //HTTPS üzerinden erişilebilir yapıyoruz.
                };
                _.SlidingExpiration = true; //Expiration süresinin yarısı kadar süre zarfında istekte bulunulursa eğer geri kalan yarısını tekrar sıfırlayarak ilk ayarlanan süreyi tazeleyecektir.
                _.ExpireTimeSpan = TimeSpan.FromMinutes(2); //CookieBuilder nesnesinde tanımlanan Expiration değerinin varsayılan değerlerle ezilme ihtimaline karşın tekrardan Cookie vadesi burada da belirtiliyor.
            });

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();

            app.UseStatusCodePages();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvc(_ => _.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"));
        }
    }

Bu işlem neticesinde uygulamada oturum açan kullanıcı oturumunu kapattığı taktirde “User/Signin” route’una yönlendirilecektir.

Evet… Bir içeriğimizin daha sonuna geldik.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek projeyi indirmek için buraya tıklayınız.

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 09 Eylül 2019

    […] Asp.NET Core Identity – Oturum Kapatma – XIII […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.