ASP.Net Core 需要做 AAD 的 OpenId 非常的方便,如果針對登入的使用者需要做額外的驗證且另外加入額外的自訂 Claim 的話,只需要新增 OpenIdConnectEvents 即可,本文簡單記錄一下實做的程式。
前言
ASP.Net Core 需要做 AAD 的 OpenId 非常的方便,如果針對登入的使用者需要做額外的驗證且另外加入額外的自訂 Claim 的話,只需要新增 OpenIdConnectEvents 即可,本文簡單記錄一下實做的程式。
實做
建立專案的時候驗證選擇 Microsoft 身份識別平台
建立完成之後再設定檔輸入相關的 AAD 應用程式設定
輸入完成之後就可以執行程式,就可以正確用 Microsoft 帳號登入驗證並且取得登入的帳號資訊
但是我們程式通常會需要額外針對登入的帳號作驗證的邏輯,確認帳號是有在資料庫內的,或是針對特定帳號需要設定特殊的角色,這時候就可以在 Startup.cs 新增底下程式碼。
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = context =>
{
var microsoftId = context.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier");
bool isAdmin = CheckIsAdmin(microsoftId);
var claims = new List<Claim>();
claims.Add(new Claim("MicrosoftId", microsoftId));
if (isAdmin)
{
claims.Add(new Claim(ClaimTypes.Role, "Admin"));
var appIdentity = new ClaimsIdentity(claims);
context.Principal.AddIdentity(appIdentity);
}
return Task.CompletedTask;
}
};
});
如此就可以針對我們的需求另外判斷使用者的身份和自訂額外的 Claims,如果需要取得這些資訊,可以使用底下程式碼來取得,底下範例為在 View 取得這些資訊。
MicrosoftId: @User.Claims.FirstOrDefault(X => X.Type == "MicrosoftId")?.Value <br />
Role: @User.Claims.FirstOrDefault(X => X.Type == ClaimTypes.Role)?.Value
結論
ASP.Net Core 越來越簡化這些登入驗證的機制,如果需要額外客制化來符合需求,都得多花一點功夫尋找資料,這次針對這一個情境稍微做一下筆記。