Custom Provider Ne İşe Yarar ?

Custom Token Provider, Identityde kullanabileceğiniz güvenlik kontrol mekanizmaları üretmenize yarar.

Örnek vermek gerekirse, bir e-mail resetleme güvenlik kontrolü yada sms ile aktivasyon verify işlemi yapabilmenizi ve bunu standart bir şekilde identity kütüphanesi ile kullanabilmenizi sağlar.

Nasıl oluşturulur ?

public class PasswordlessLoginTotpTokenProvider<TUser> : TotpSecurityStampBasedTokenProvider<TUser> 
    where TUser : class
{
    public override Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TUser> manager, TUser user)
    {
    //Eğer Two Factor kontrolü yapmak isteseniz burada kontrolünü yapabilirsiniz
   //Kullanabileceğiniz metodlar
   //manager.IsEmailConfirmedAsync(user)
   //manager.IsInRoleAsync(user,"Role")
   //manager.IsLockedOutAsync(user)
   //manager.IsPhoneNumberConfirmedAsync(user)
   //Bunlardır
        return Task.FromResult(false);
    }

    public override async Task<string> GetUserModifierAsync(string purpose, UserManager<TUser> manager, TUser user)
    {
        var email = await manager.GetEmailAsync(user);
        return "PasswordlessLogin:" + purpose + ":" + email;
    }
}

Oluşturduğunuz Cutom Token Providerı uygulamanız çalışırken register etmeniz gereklidir. UserManager<TUser> sınıfı içerisinde providerları HashMap collection yapısında tutar ve siz gerektiğinde belirttiğiniz keyword ile çağırabilirsiniz

Uygulama Başlarken Custom Token Providerın Kayıt Edilmesi

Bunun için küçük bir extension metod hazırlayalım

public static class CustomIdentityBuilderExtensions
{
    public static IdentityBuilder AddPasswordlessLoginTotpTokenProvider(this IdentityBuilder builder)
    {
        var userType = builder.UserType;
        var totpProvider = typeof(PasswordlessLoginTotpTokenProvider<>).MakeGenericType(userType);
        return builder.AddTokenProvider("PasswordlessLoginTotpProvider", totpProvider);
    }
}

Burada dikkat etmeniz gereken şey 7. satıdaki AddTokenProvider metodunun ilk parametresi olan “PasswordlessLoginTotpProvider” string kelimesidir. Oluşturduğumuz providerı artık bu kelimeyle çağırıcaz.

Uygulama başlarken yazdığımız custom providerı register edelim

public class Startup  
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddIdentity<IdentityUser, IdentityRole>()
            .AddEntityFrameworkStores<IdentityDbContext>() 
            .AddDefaultTokenProviders()
//Burada oluşturduğumuz extension metodumuzu çağırıyoruz
            .AddPasswordlessLoginTotpTokenProvider(); 
    }
}

Custom Token Providerı ile Token Generate Etme

var token = await userManager.GenerateUserTokenAsync(user, "PasswordlessLoginTotpProvider", "passwordless-auth");

GenerateUserTokenAsync metodunda dikkat ettiyseniz 3 tane parametre almaktadır.

İlk parametre hangi kullanıcı için token oluşturduğumuzu belirtir.

İkinci parametrede ise hangi token providerı çağarıcağımızı seçeriz. Oluşturduğumuz custom token providerın uygulama başlarken register ettiğimiz ismiyle aynı olması gerekmektedir. UserManager<TUser> sınıfının içerisindeki token providerları HashMap collectionunda tuttuğu için custom token providerı verdiğimiz bu Key ile bulur.

Üçüncü parametre ise tokenın ne amaçla oluşturulduğunu belirten kelimedir. Bu kelimeyi tokenı verify ederken tekrar kullanacağız, o yüzden, hem anlaşılabilir hem de amacına uygun bir kelime vermeye dikkat ediniz.

Custom Token Verify Etme İşlemi

var isValid = await userManager.VerifyUserTokenAsync(user, "PasswordlessLoginTotpProvider", "passwordless-auth", token);

Tokenımızı verify ederken bu sefer 4 parametre alır. Bunların 3’ü zaten yukarıda anlattığım parametre açıklamalarıyla aynıdır. 4. parametresine yukarıda oluşturduğumuz tokenı verdiğimizde bize girilen tokenin geçerli olup olmadığını döndürür.

Farkettiyseniz oluşturduğumuz providerımızı TotpSecurityStampBasedTokenProvider sınıfından kalıtım alarak oluşturduk. Bu sınıfın oluşturduğu tokenımız varsayılan olarak 3 dakika boyunca valid sayılacaktır. Bu süreyi arttırmak için kendi sınıfınızı yazabilirsiniz. Daha detaylı anlatım için makalenin en altında vericeğim ingilizce içeriği inceleyebilirsiniz.

Kaynak : Andrewlock

Cevap Ver

Lütfen yorumunuzu yazınız!
Lütfen isminizi buraya giriniz