ASP.Net Core 自訂登入驗證和新增自訂 Claim

  • 67
  • 0

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 越來越簡化這些登入驗證的機制,如果需要額外客制化來符合需求,都得多花一點功夫尋找資料,這次針對這一個情境稍微做一下筆記。

參考資料

  1. Adding custom claims to a user during authentication with ASP.NET Core 2.0