iT邦幫忙

0

.Net MVC5 ADFS 採用 WS-Federation進行登入

關於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站台時要確定好網站階層
例如:
https://ithelp.ithome.com.tw/upload/images/20181109/20113239vvdZh8qyI0.png
在預設站台下建置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
https://ithelp.ithome.com.tw/upload/images/20181109/20113239qmfBBRg538.png
但既然都已經從ADFS取得認證資料,想必還有像是Email、組織、部門等資訊,想要順帶從ADFS取用吧?

想要取得這些資訊,可以透過System.Security.Claims.ClaimTypes去取用
https://ithelp.ithome.com.tw/upload/images/20181109/20113239lszxqVCg91.png

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/>
}

https://ithelp.ithome.com.tw/upload/images/20181109/20113239lQ4Gv2JpMI.png

若是沒有回傳預期中的欄位,則必須要去ADFS伺服器端設定
因為「各用戶端」需要使用到那些欄位,ADFS伺服器端是可以分開設定的
https://ithelp.ithome.com.tw/upload/images/20181109/20113239yNjUxbLlu0.png

預設可使用的欄位如下:
https://docs.microsoft.com/zh-tw/dotnet/api/system.security.claims.claimtypes?view=netframework-4.7.2

提醒:ADFS還有SAML可選擇,在ADFS中的回傳格式可與WS-FED不同。


尚未有邦友留言

立即登入留言