Makale Özeti

Microsoft® .NET Passport 2.1 sağladığı Single Sign-In işleviyle bu süreci basitleştirebilir. .NET platformunun ortaya çıkışıyla birlikte "Passport" da .NET güvenlik modelinin bir parçası haline geldi. Bu yazıda mobil sitede yapılacak basit değişikliklerle Passport Single Sign-In metodu kullanılır hale gelecektir.

Makale

Mobil web uygulamaları kullanıcı doğrulaması ve giriş yapma prosedürleri söz konusu olduğunda bazı özel zorluklara sahiptir.

Ve özellikle bazı uygulamalar, giriş yapma sürecine ihtiyaç duyarlar. Microsoft® .NET Passport 2.1 sağladığı Single Sign-In işleviyle bu süreci basitleştirebilir. .NET platformunun ortaya çıkışıyla birlikte "Passport" da .NET güvenlik modelinin bir parçası haline geldi. Bu yazıda mobil sitede yapılacak basit değişikliklerle Passport Single Sign-In metodu kullanılır hale gelecektir.

Sınırlamalar

Mobil Cihazlar ve Passport

Microsoft .NET Passport 2.1 mobil cihazlar için destek sağlar, ancak tüm işlevsellik desteklenmez. Sadece Passport Single Sign-In (SSI) desteklenmektedir. Kids Passport ve Express Payment da henüz desteklenmemektedir.

Çoğu mobil cihazın sınırlı ekran ve grafik yetenekleri olması sebebiyle, Microsoft bu cihazlarda Passport kullanımını gerekli kılmamıştır. Buna ek olarak, Passport LogoTag2 komutu bazı cihazlarla her zaman uyumlu olmamaktadır. Bunun anlamı, giriş/çıkış durumu yönetiminin, giriş yapma sayfasına yöneltme ile birlikte gerçekleştiriminin yapılması gerektiğidir.

.NET Passport 2.1 ile gelen yeni bir özellik de, geleneksel e-mail ve şifre ile giriş yapmanın yerine telefon numarası-PIN numarası ikilisinin kullanılabilmesidir. Bu durumda kullanıcının ihtiyacı olan tuşlama sayısındaki azalma ile mobil cihazlarda kullanıcı girişi yapma kolaylaşacaktır.

Kullanıcılarınızı .NET Passport Member Services Sayfasına yönlendirmek isteyebilirsiniz, böylece kullanıcılar mobil cihazlarının telefon numarasını girebilirler ve bir PIN seçebilirler. Bu işlem bir kez yapıldığında, kullanıcılar e-mail/şifre veya telefon numarası/PIN ikililerinden birisiyle giriş yapma arasında seçim yapabilirler.

Desteklenen Cihazlar

Passport çok çeşitli cihaz ve taşıyıcı ile test edilmiştir. Bkz : Passport SDK

Sitelere Passport ekleme

Passportun kullanım kuralları web sitelerinin "soft sign-in" ya da "hard sign-in" kullanmalarına izin verir.
Bir "soft sign-in", kullanıcıların Web sitesini Passport sistemine giriş yapmadan tarayabilmelerine izin verir.
Bu seçenek, kullanıcının istediği an giriş yaparak Passport hesabıyla ilişkilendirilmiş çeşitli işlevlerle kişiselleşmiş içerik, ya da isteğe bağlı bilgileri görmesini sağlar.
Bir "hard sign-in" web sitesinin herhangi bir kısmına erişmeden önce kullanıcının giriş yapmış olmasını gerektirir.
Bu yazımızdaki amaçlar doğrultusunda "hard sign-in" yöntemini kullanacağız.

Mobil Sitenin Passport Kullanımı için Ayarlanması

İlk adım, web sitesinin ".NET passport authentication" için düzenlenmesidir.
Bu, web.config dosyasındaki "authentication" elemanının değiştirilmesiyle olur.

<authentication
mode="Passport"
/>

Birçok mobil cihazın cookieleri desteklememesi sebebiyle, Web.confige yapılacak ufak bir değişiklikle cookieler etkisiz hale getirilir. Bu kez "sessionState" bölümünde şu değişiklik yapılır.

<sessionState

cookieless="true"
/>

Passport cookieleri desteklemeyen bir cihaz algıladığında, Doğrulama bileti (authentication ticket) URLde şifrelenir. Bu bilet, her istem için giriş sayfasının sürekli olarak ortaya çıkmadan kullanıcının doğrulanmış (authenticated) olarak kalması için sayfadan sayfaya geçirilmelidir.

Normalde bu şifrelenmiş URLin yönetimi gerçekleştirilmelidir, ancak Microsoft Mobile Internet Toolkit "cookielessDataDictionary" adı verilen ve otomatik olarak URL şifreli cookieleri yöneten bir mekanizma sağlar. Ancak, "cookielessDataDictionary" nin standart versiyonu, Passport parametrelerini de destekleyen yeni bir gerçekleştirimle değiştirilmelidir.

Cookieless Veri Sözlüğü gerçekleştirimi

Bir cookielessDataDictionary, basitçe bir IDictionary gerçekleştirimidir.
Gerçekleştirimi yapan kişi olarak sorumluluğumuz, şifreli URLden (encoded URL) gerekli parametreleri alarak, sözlüğümüzde saklamaktır.
cookielessDataDictionary mekanizması, birbirini izleyen her istem için bu parametreleri otomatik olarak URLe ekleyecektir.
Aşağıdaki kod parçasında, "t" parametresini gelen istem URLinden çekerek saklayan basit bir HybridDictionary gerçekleştirimi yapmaktayız.

Passport "t" parametresini şifreli doğrulama biletini (encoded authentication ticket) saklamak için kullanır.

using System.Collections.Specialized;
using System.Web;

namespace MobilePassport
{
class PassportDictionary : HybridDictionary
{
public PassportDictionary()
{
string inboundValue = HttpContext.Current.Request.Params["t"];
this["t"] = inboundValue;
}
}
}

Ne yazık ki, bazı mobil cihazlar Passport parametrelerini kendi URL biçemi kapsamına alırlar. Örneğin, UP simülatörü "t" parametresini bir doğrulama başlığı (authorization header) içinde geçirir:

HTTP: Authorization=Passport1.4 from-
PP=t=1PDQ4g5ewDG3svRgpIzMZJ*xgAJytCTFL!SXjdH

Bu tür durumları işlemek için, sözlük gerçekleştirimimiz daha akıllı olmalı ve gömülü biletler (embedded tickets) aramalıdır. Gömülü "t" parametresini ayrıştırmak için düzenli ifadeler (regular expressions) kullanılır. Bu sınıfın görünümü artık şöyle olacaktır:

using System.Collections.Specialized;
using System.Text.RegularExpressions;
using System.Web;

namespace MobilePassport {
class PassportDictionary : HybridDictionary
{
public PassportDictionary()
{
GetT(HttpContext.Current.Request.Params);
}

public void GetT(NameValueCollection parameters)
{
string t = parameters["t"];
if(t != null)
{
this["t"] = t;
return;
}
GetEmbeddedT(parameters);
}

/// <summary>
/// Kullanılan cihaza bağlı olarak, T değeri bir dönüş parametresinin içine
///gömülebilir.

/// Bu fonksiyon t=XXXXX gibi bir desene bakarak
/// bir parametre içinde "t" yi arar.
/// XXXXX in uzunluğu 90 karakterdir.
/// </summary>
/// <remarks> bigt=XXXXX gibi bir desen hatalıdır, t=
/// bir alfa-nümerik olmayan karakter ile başlamalıdır.
/// </remarks>
/// <param name="parameters"></param>
public void GetEmbeddedT(NameValueCollection parameters)
{
string t_pattern = @"^(.*[^\w])?t=(.{90})(.*)";
string t_value = @"$2";
foreach(string key in parameters)
{
string value = parameters[key];
if(Regex.IsMatch(value,t_pattern))
{
string temp =
Regex.Replace(value,t_pattern,t_value);
this["t"] = temp;
return;
}
}
}


public void RemoveCookies()
{
this.Clear();
}
}
}

Yeni cookielessDataDictionary gerçekleştirimini derlediğimizde, mobil sitemizi
Web.config dosyasındaki "mobileControls" bölümünü değiştirerek bağlamalıyız :

<mobileControls
sessionStateHistorySize="6"
cookielessDataDictionaryType="MobilePassport.PassportDictionary,
MobilePassport"
/>

MobilePassport.PassportDictionary sınıfımızın adıdır ve son parametre, MobilePassport, DLL in adıdır. DLL web.config dosyası ile aynı "path" te olmalıdır. Bundan sonra yapılması gereken işlem, Passport Single Sign-In için mobil web sitesindeki gerçekleştirimdir.

Passport Single Sign-In gerçeklestirimi

Sitenizin kullanıcıyı otomatik olarak doğrulamasını sağlamak için,
aşağıdaki kod global.asax dosyasına eklenerek, bu dosya içinde
PassportAuthenticationın OnAuthenticate olayı yakalanmalıdır.

public void PassportAuthentication_OnAuthenticate(Object sender,
PassportAuthenticationEventArgs e)
{
System.Web.Security.PassportIdentity id = e.Identity;

if(!id.IsAuthenticated)
{
System.Web.UI.MobileContrls.MobilePage mobile_page =
new System.Web.UI.MobileControls.MobilePage);
mobile_page.RedirectToMobilePage(
id.AuthUrl2(
"http://Sunucunuz/Siteniz/AnaSayfa.aspx",
-1,
true,
String.Empty,
-1,
String.Empty,
-1,
false
)
);
}

Bu kod o anki kullanıcının PassportIdentity sini alır ve kullanıcının doğrulanmış
olup olmadığını kontrol eder. Eğer kullanıcı doğrulaması yapılmamışsa,
kullanıcı girişi için passport servisini çağırır.
Bundan sonra, kişinin kimliğinden (Identity) Passport bilgisine nasıl ulaşacağımızı inceleyeceğiz:

bu örnekte basit olarak "Passport ID" ve "Authentication" durumunu text değişkenlerde tutacağız.

private void Page_Load(object sender, System.EventArgs e)
{
System.Web.Security.PassportIdentity id =
(System.Web.Security.PassportIdentity)
Context.User.Identity;

passportId.Text = id.Name;
isAuthenticated.Text = id.IsAuthenticated.ToString();
}

Çıkış yapma(Log Out)

Cookieless cihazlar kullanılırken, sorgu katarı (querystring) passport bilgisinden arındırılmalıdır.
Bu en iyi, "PassportIdentity"ye ait "SignOut" metodunda "Session" çağrılarak gerçekleştirilir.
"RemoveAll" ile sözlük örneği temizlenebilir ve parametresiz olarak bir başka sayfaya yönelim sağlanabilir:

id.SignOut();
Session.RemoveAll();
ActiveForm = LogoutForm;

Ve bu, bir Passport Single Sign-In oturumunun kapatılmasını tamamlayabilir.

Özet

Microsoft Mobile Internet Toolkit ile Pasaport entegrasyonu, sitelerin kullanıcı doğrulaması ihtiyaçları için basit bir çözümdür. Cihazların çok çeşitli yetenek ve biçemleri göz önünde bulundurulduğunda, Passport kullanıcıdan alınacak minimum bilgiyle kullanıcı giriş-çıkış işlemlerini birçok cihaz üzerinde ele alabilen esnek bir sistem oluşturmaya yardımcı olabilir. Passport ve MMIT cookilessDataDictionary bileşimiyle az miktarda ekstra kodlama sayesinde gerçekleştirilen çözüm neredeyse her cihazdan erişilir hale gelebilir.

Referanslar :
MSDN Home > MSDN Library > .NET Development > Mobile Internet Toolkit >