Önceki yazıda SharePoint’i  FBA için yapılandırmıştık. FBA kullanan bir application’ı açtığımızda giriş yapmak için authentication tipini seçmemizi isteyen default login sayfası açılmaktadır. Windows authentication seçildiğinde windows user’ı ile portale login olmaya çalışacaktır. Forms authentication seçildiğinde username ve password girmemizi isteyen başka bir sayfa açılacaktır. User friendly bir durum değil. Bu yazıda custom login page geliştirip, kullanacağız.

Öncelikle Visual Studio’da SharePoint 2013 – Empty Project oluşturalım. Solution’a sağ tıklayıp, Add/SharePoint “Layouts” Mapped Folder’ı tıklayarak Layouts klasörünü projemize ekleyelim. Layouts klasörü altında solution’ın adıyla bir klasör oluşturulacaktır. Klasöre sağ tıklayıp, Add/New Item’dan yeni bir Application Page ekleyelim. Application Page, LayoutsPageBase sınıfından türetilmiştir. Sayfayı Page sınıfından türetiyoruz.

using System;
using Microsoft.SharePoint;
using System.Web.UI;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.IdentityModel;
using System.Web.Security;
using Microsoft.SharePoint.Administration.Claims;

namespace FBADemo.Layouts.FBADemo
{
public partial class CustomLogin : Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}

Tasarım tarafında ise Page direktifinden  DynamicMasterPageFile=”~masterurl/default.master”  bölümünü ve bütün contentleri siliyoruz. Son durumda tasarım tarafı aşağıdaki gibi olmalıdır:

<%@ Assembly Name=”$SharePoint.Project.AssemblyFullName$” %>
<%@ Import Namespace=”Microsoft.SharePoint.ApplicationPages” %>
<%@ Register Tagprefix=”SharePoint” Namespace=”Microsoft.SharePoint.WebControls” Assembly=”Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register Tagprefix=”Utilities” Namespace=”Microsoft.SharePoint.Utilities” Assembly=”Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Register Tagprefix=”asp” Namespace=”System.Web.UI” Assembly=”System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ %>
<%@ Import Namespace=”Microsoft.SharePoint” %>
<%@ Assembly Name=”Microsoft.Web.CommandUI, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”CustomLogin.aspx.cs” Inherits=”FBADemo.Layouts.FBADemo.CustomLogin” %>

Örnek olarak aşağıdaki tasarımda bir login page tasarlayalım:

Custom Login Page Design
Custom Login Page Design

TextBox, Label, Buton kullanarak da tasarım yapılabilir ancak ASP.NET 2.0 ile gelen Login kontrolü dururken kim uğraşacak tasarımla:) Toolbox’da Login kontrolleri SharePoint projects için disabled durumdadır. Bir ASP.NET projesi oluşturup, Login kontrolünüzü ayarladıktan sonra kodunu kopyalayabilirsiniz. Yukarıdaki tasarım için aşağıdaki kodu tasarım tarafına ekleyebilirsiniz.

<html>
<body>
<form runat=”server” id=”form1″ >

</form>
</body>
</html>

Login kontrolünün kullanımına internetten bakabilirsiniz. Login kontrolünün OnAuthenticate olayında authentication işlemini gerçekleştiriyoruz. Ama öncelikle windows kullanıcısı ile nasıl login olunacağına bakalım. Eklediğimiz LinkedButton’un OnClick olayında windows authentication işlemini aşağıdaki gibi gerçekleştiriyoruz:

protected void lnkBtn_WindowsAuth_Click(object sender, EventArgs e)
{
SPIisSettings iisSettings = SPContext.Current.Site.WebApplication.IisSettings[SPUrlZone.Default];
if (iisSettings != null && iisSettings.UseWindowsClaimsAuthenticationProvider)
{
SPAuthenticationProvider provider = iisSettings.WindowsClaimsAuthenticationProvider;
string url = provider.AuthenticationRedirectionUrl.ToString();
if (!url.Contains(“ReturnUrl”))
{
url += “?ReturnUrl=” + SPContext.Current.Site.Url;
}
SPUtility.Redirect(url, SPRedirectFlags.Default, this.Context);
}
}

Default zone’un IIS ayarlarını çekip, Windows authentication’ın aktif olup olmadığını kontrol ediyoruz. Aktif ise provider’ı alıp, authentication url’e yönlendirme yapıyoruz. Böylece kullanıcı linke tıkladığında, windows kullanıcısı ile portale yönlendirilecek.

Şimdi username,password girerek authenticate olmaya bakalım. Anti parantez; Login kontrolü kullandığımız için username ve password alanlarının boş olması ve geçersiz bir username-password bilgisi girilmesi gibi durumları kontrol için ekstra bir kod yazmamız gerekmemektedir.

Login kontrolünün OnAuthenticate olayını aşağıdaki şekilde işleyerek forms authentication ile portale bağlanabiliriz.

protected void Login1_Authenticate(object sender, System.Web.UI.WebControls.AuthenticateEventArgs e)
{
SPIisSettings iisSettings = SPContext.Current.Site.WebApplication.IisSettings[SPUrlZone.Default];
if (iisSettings.UseFormsClaimsAuthenticationProvider)
{
string mp = iisSettings.FormsClaimsAuthenticationProvider.MembershipProvider;
MembershipProvider mprovider = Membership.Providers[mp];
if (mprovider.ValidateUser(Login1.UserName, Login1.Password))
{
Response.Cookies.Clear();
bool status = SPClaimsUtility.AuthenticateFormsUser(this.Page.Request.Url, Login1.UserName, Login1.Password);

if (status)
{
SPUtility.Redirect(SPContext.Current.Site.Url, SPRedirectFlags.Default, this.Context);
}
else
{
SPUtility.HandleAccessDenied(new Exception(“Access is denied.”));
}
}
}
}

IIS ayarlarını çekip, forms authentication’ın aktif olduğu kontrolünü yapıyoruz. Sonra, girilen username-password bilgilerinin forms authentication için geçerli bir user olup olmadığını kontrol ediyoruz. Sonra, SPClaimsUtility.AuthenticateFormsUser  metodu ile forms authentication’ı gerçekleştiriyoruz. Authenticate olursa portale, olmaz ise AccessDenied sayfasına yönlendiriyoruz.

FBA Configuration’ı açıkladığımız yazıda, fbatest ve fbaadmin isminde iki user oluşturmuş ve demo portalimiz üzerinde yetkilendirmiştik. Bu kullanıcılardan biri ile giriş yaptığımızda login olduğumuzu göreceğiz. Ancak burada bir sorun var. Login ekranlarında “Beni hatırla” seçenekleri olur. Bu seçenek seçildiğinde kullanıcı bilgileri cookie’lere yazılır, sonraki girişlerde bilgiler cookie’den okunur. Dolaysı ile authenticate metodunda cookie kullanımı için bir parametre olmalı. Buradaki sorunu;  FBA user ile login olup, sonra browser’î kapatıp, sonra tekrar browser açıp portale girmek istediğinizde fark edeceksiniz. “Beni hatırla” seçeneğini seçmeseniz de son login olduğunuz kullanıcı ile doğrudan login olduğunuzu göreceksiniz. Yani SPClaimsUtility.AuthenticateFormsUser metodu kullanıcıyı cookie’ye yazarak authenticate oluyor. Ama metodda cookie ile ilgili bir parametre yok. Dolaysı ile browser kapatılsa da cookie nedeniyle sonraki girişlerde login ekranı karşımıza gelmeden doğrudan portale login olmuş olacağız. Bu istenmeyecek bir durumdur. SPClaimsUtility.AuthenticateFormsUser metodunda neler yapılıyor görmek için Microsoft.SharePoint.IdentityModel dll’ini Reflector’da açıp, metodun içeriğine baktım. Aşağıdaki resimde de görüldüğü gibi SPSecurityTokenServiceManager.Local.UseSessionCookies property’sinin durumuna göre cookie’ye yazılma durumu belirleniyor.

AuthenticateFormsUser Metodu
AuthenticateFormsUser Metodu

Property false olduğunda cookie’ye yazılıyor, true olduğunda cookie’ye yazılmıyor. İşte aradığımız:)

SPClaimsUtility.AuthenticateFormsUser metodunun hemen üzerine aşağıdaki satırı ekliyoruz:

SPSecurityTokenServiceManager.Local.UseSessionCookies = !Login1.RememberMeSet;

Login kontrolünde “Beni hatırla” seçildiğinde cookie’ye yazılacak ve sonraki girişlerde otomatik login olunacak. Seçilmediğinde ise cookie’ye yazma işlemi gerçekleşmeyecek ve sonraki girişlerde tekrar Login sayfası açılacak.

Custom login sayfamız hazır. Şimdi portale erişilmek istendiğinde login page olarak bu sayfayı ayarlayalım.

Central Administration’dan Managed Web Applications’a girelim. Portalimizi seçip ribbondan Authentication Providers’ı tıklayalım. Açılan ekrandan zone seçeceğiz. Default zone seçelim(Hangi zone’daki portal için FBA uygulayacak ise koddaki zone bölümünü buna göre düzenlemelisiniz). Açılan ekranda Sign In Page URL bölümünde custom login page’i aşağıda görüldüğü gibi ayarlıyoruz.

Sign In Page Url
Sign In Page Url

Böylece custom login sayfası geliştirmiş olduk. Sonraki yazıda görüşürüz.

Reklamlar