İçeriğe geç
Anasayfa » LinOTP 2FA Api .Net Entegrasyonu

LinOTP 2FA Api .Net Entegrasyonu

Bu yazımda sizlere open source olan LinOTP 2FA platformundan bahsetmek istiyorum. Python dili ile geliştirilmiş olan LinOTP, hem on-premise hem de cloud-base kurulumu ile güçlü doğrulama yöntemlerini yenilikçi, esnek ve çok yönlü olarak sunan bir OTP (one time password) platformudur.

Aslında GNU/Linux sistemi için kurgulanmıştır ancak Python’da yazıldığı için diğer işletim sistemlerinde de çalışabilir.Ayrıca LinOTP modüler bir yapıya sahiptir. Stabil bir core module ve bunun etrafında oluşturulmuş bazı modüller(Audit, SMS, managment vb.) ile entegrasyon ve yeni modüllerin geliştirilmesine olanak sağlar.

Yukarıdaki LinOTP architecture şeması üzerinde de görüldüğü gibi management modülü web arayüzlerine sahiptir. Bu arayüzler sayesinde kullanıcılara token create, deactive gibi işlemler sağlanmaktadır. LinOTP kurulumu ve standart arayüzlerin kullanımından bahsetmeyeceğim. Bunun için buraya tıklayarak ilgili yazıyı okuyabilirsiniz.

Bu yazımızda ise LinOTP arayüzlerini devre dışı bırakarak ya da kendinize özel uygulamalar geliştirmek için management modülüne ait apilerin .Net ile entegrasyonundan bahsedeceğim. Bu konu için LinOTP dokümantasyonunun ve kaynakların yetersiz olmasından dolayı, LinOTP kaynak kodlarının inceleme ve .Net için diğer dillerden kod dönüşümleri yapmam gerekti.

Şimdi adım adım managment modulünde bulunan admin api’leri kullanımı ile başlayacağız. Öncelikle tüm end point’lerin ortak olarak kullanacağı bir async post web request metodu oluşturalım.

<script src=”https://gist.github.com/mcaninci/bd6060a3467c5fc04a1c0445442ca45a.js”></script>

Yukarıdaki metot birkaç kritik nokta dışında endpoint url request body ve header alarak post isteği gönderen ve generic response dönen bir htttp client metodudur.

Peki bu metottaki kritik noktalar nelerdir

LinOTP admin ve management endpoint’leri web arayüzünde de authentication metot olarak standart şekilde Ldap authentication kullanmaktadır. Bu yüzden atılan tüm isteklerde user ve password network credential olarak geçilmek zorundadır (Line 13–14).

Ayrıca birbirini takip eden isteklerde header üzerinden set isteği ile gelmiş olan cookie verilerinin diğer isteklerde request header’a eklenmesi gerekmetir. Özelikle ”admin_session” cookie’si tüm işlemlerde kontrol edilen ve session register api’si ile elde edilen temel bir cookie’dir.

Yapacağımız örnekte senaryomuz desktop bir uygulama içerisinde user name bilgisini alıp, create edilmiş olan LinOTPtoken’ını silerek 2FA özelliğini bu user için devredışı bırakmak olacaktır. Öncelikle admin user’ımız için session’ımızı alacağız, ardından sistemdeki tüm user’ları alıp hedef user’ı tespit edeceğiz. Son aşamada ise bu user’ın aktif olan token’ını silerek işlemi tamamlayacağız.

Öncelikle api’lerin kullanılması için LinOTP bir session register edilmesi gerekmektedir. Bunun için “{domain}/admin/getsession” endpoint’ini çağırmamız gerekiyor.

Bu endpoint response olarak bize set cookie ile ”admin_session” bilgisi dönecektir. Gelen response cookie’lerden ”admin_session” alarak bundan sonra çağıralacak tüm endpoint’lere ekleyerek ilerleyeceğiz. (Line 15)

<script src=”https://gist.github.com/mcaninci/f27a0a950ac53bb4b738d950b8668889.js”></script>

Artık LinOTP üzerinde aktif bir session’a sahip olduğumuz için diğer endpoint’ler ile devam edebiliriz. Sistem üzerinde oluşturulmuş user’ları ve tüm token’ları listelemek için “{domain}/admin/show” endpoint’ini kullanacağız. Response üzerinden işlem yapmak istediğimiz user için aktif token bilgileri alarak işlemlerimize devam edeceğiz. (Line 28–32)

<script src=”https://gist.github.com/mcaninci/3e44e4788eeeea1fc31d1c4794af8023.js”></script>

Not: Gelen response model biraz büyük olduğu için modelini oluşturmak amacıyla https://json2csharp.com/’dan yararlandım. Gayet kullanışlı olan bu site ile json datadan c# model class’ınızı kolayca oluşturabilirsiniz.

İşlem yapılacak kullanıcının bilgilerini aldıktan sonra aktif token’ı silerek kullanıcının bu token’ı kullanmasını engelleyeceğiz. Bu işlem için “{domain}/admin/remove” endpoint’ini kullanacağız. Body içerisine session parametresi ile admin session bilgisini ve serial parametresi ile silmek istediğimiz token’ın session serail bilgisini ekliyoruz. Ardından response true olarak geldiyse işlemimiz başarı ile gerçekleşmiş demektir.

<script src=”https://gist.github.com/mcaninci/23a3556801a2e20597a8eee694050e22.js”></script>

Aktif bir ”admin_session” cookie’niz olduğu ve asyncpost metodunu kullanarak gerekli cookie setlerini yaptığınız sürece LinOTP’nin diğer tüm endpoint’lerini örneğimizde olduğu gibi rahatça kullanma imkanı bulacaksınız.

Uygulamanın örnek kodlarını bağlantıdan indirebilirsiniz.

Umarım faydalı olmuştur. Bir sonraki yazımızda görüşmek üzere 😊

Referanslar

https://medium.com/@katerynamok/linotp-installation-and-usage-1addc11b3c74

https://linotp.org/doc/latest/index.html

https://github.com/LinOTP/LinOTP/tree/master/linotp/controllers

Etiketler:

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.