20 Ağustos 2016 Cumartesi

Asp.Net Core Web Uygulamasında geliştirme ve canlı ortam tanımları

Bir çok blog yazısında .Net/Asp.Net Core ile birlikte gelen "App Secrets" aracının nasıl kullanılacağı ile ilgili bilgi olmasına rağmen canlı ortamda tavsiye edilen "Environment Variables" kullanımın nasıl gerçekleştirileceği ile ilgili bilgi yok.

App Secrets / User Secrets ile ilgili genel bilgi.
https://docs.asp.net/en/latest/security/app-secrets.html


Çözümün doğuş nedeni:

Bu yöntemin kullanılmasının tavsiye nedeni çoğunlukla şifre gibi önemli bilgilerin appsettings.json da (önceden web.config) unutulması, dolayısıyla "Source control" ortamına yapılan "Check-in" işlemlerinde bu bilgilerle birlikte gitmesi. İnternete açık değilse çok büyük bir problem değil gibi düşünülebilir.

Bir diğer nedeni de geliştirme veya test ortamından canlı ortama yapılan aktarımlarda appsetttings.json dosyayının ezilmemesini sağlama yada canlı ortama göre şifre vs. gibi tanımları tekrar yapma gerekliliği.

Dolayısıyla önerilen yöntem şifre gibi ortama göre değişecek diğer bilgileri yapılan Deployment/Publish işleminden ayrıştırmaya yarıyor.

Bu da geliştirme ortamı için "App Secrets" ve canlı ortam için "Ortam Değişkenleri" kullanımı.
Sunucuya erişimi olanlarında şifreleri görmemesi isteniyorsa, bunun için de  farklı yöntemler vardır.


Uyumun sağlanması


appsettings.json dosyası:


secrets.json dosyası:





Tanımlara erişim

Ortam değişkenlerine bu şekilde de erişilebilir:
Environment.GetEnvironmentVariable("OAuth:Facebook:ClientId")

Bu durumda geliştirme veya canlı ortama göre kontrol gerekecektir.
İlgili tanımlar aşağıdaki anlatıldığı şekilde ortam değişkenlerimde tanımlanırsa
sadece Configuration["OAuth:Facebook:ClientId"] yeterli olacaktır.

Bununla birlikte "magic string" kullanımı engellemek için IOptions arayüzü kullanılmalı:

appsetttings.json tanımlarının sınıf olarak tanımı ve IOptions<> arayüzü üzerinden istenilen sınıfa "Dependency Injection" ile aktarılması.
https://docs.asp.net/en/latest/fundamentals/configuration.html
http://www.davidhayden.me/blog/asp-net-5-configuration-and-ioptions



Canlı ortamda uygulama tanımlarına erişim

App-Secrets dosyasında yapılan key oluşturma formatına benzer yöntem ile Windows'un Ortam değişkenleri / Environments Variables tanım penceresi üzerinde istenen değişkenker eklenir.
Örnek değişken: OAuthProviders:Facebook:AppId

"Ortam değişkenleri" / "Environments Variables" penceresine erişim:
Computer Properties > Advanced System Settings > Advanced > Environment Variables
üzerinden erişilen ortam değişkenlerinde System Variables alanında tanım yapılmalıdır.

System Variables kullanılmasının nedeni IIS'in kendi hesabı üzerinden çalıştğından (Application Pool Identity) Bknz: http://stackoverflow.com/a/5731360/503274 ve http://www.iis.net/learn/manage/configuring-security/application-pool-identities, "User Variables"'a yani oturum aşmış kullanıcının ortam değişkenlerine erişemez.


Hiç yorum yok: