關於MVC使用ADFS進行認證,網路上其實有很多教學作法,
最簡易的方式是在專案建立的時候,採用MVC範本,並且選擇工作帳戶選項。
但是實際狀況多為建立空專案,加上如遇到的狀況是公司MIS只提供服務,
但並未告知細節內容下,則開發時會產生許多疑問與不解。
因此在這樣的狀況下,要怎麼樣才可以使用呢? 以此篇作為一個筆記。
首先
1.要先確定站台可以啟用SSL
2.Web.Config中必須要放置下列兩項資訊
3<appSettings>
<add key="ida:ADFSMetadata" value="https://example.com/federationmetadata/2007-06/federationmetadata.xml" />
<add key="ida:Wtrealm" value="https://localhost:443/"/>
</appSettings>
ADFSMetadata中的xml是從內部部署機構所領取到的。
例如:公司發行的會將example.com換為公司ADFS的DNS
ADFSMetadata此部分是公司內部所有專案皆適用,若公司無採購建置ADFS,微軟的Azure也有付費服務可使用。
Wtrealm部分是網站識別碼,作為與ADFS進行認證時所使用的代碼,並且ADFS的登入入口會設置一個名稱與此代碼對應。
因此此代碼有兩項作用
(1)認證使用
使用正確的xml但是不正確的Wtrealm,仍是可以被轉移至登入頁面,但是登入完成後會出現錯誤(卡在ADFS上),原因是網站與Wtrealm無法對應
(2)ADFS網站選單
直接使用ADFS入口進行登入狀況下,由於ADFS登入完畢後並未攜帶來源網址,因此ADFS登入頁面會有選單供選擇要登入的網站
因此建議在實體伺服器,設置IIS站台時要確定好網站階層
例如:
在預設站台下建置application狀況下,建議將Wtrealm設置為
https://localhost:443/yourApplicationName
這樣在該application下的MVC5專案所有路徑皆可適用
接著請至ConfigureAuth設置下列內容public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(
new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
});
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
MetadataAddress = ConfigurationManager.AppSettings["ida:ADFSMetadata"],
Wtrealm = ConfigurationManager.AppSettings["ida:Wtrealm"]
});
app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
}
至於要如何接到ADFS內容並取用呢?
最簡易作法為直接呼叫User.Identity
但既然都已經從ADFS取得認證資料,想必還有像是Email、組織、部門等資訊,想要順帶從ADFS取用吧?
想要取得這些資訊,可以透過System.Security.Claims.ClaimTypes去取用
System.Security.Claims.ClaimTypes中,有許多已經與ADFS整合完畢的資訊,當然要客製化屬性欄位也可以,只是需要ADFS Server端設定。
接著來看一下收到的內容
先在Controllers Class 加入引用(using System.Security.Claims;
)
直接在Controllers、Action中加入return View((User as ClaimsPrincipal).Claims);
View中加入@foreach (var claim in Model)
{
@claim.Type @claim.Value<br/>
}
若是沒有回傳預期中的欄位,則必須要去ADFS伺服器端設定
因為「各用戶端」需要使用到那些欄位,ADFS伺服器端是可以分開設定的
提醒:ADFS還有SAML可選擇,在ADFS中的回傳格式可與WS-FED不同。