1. クレームのマッピングのスクリプト

クレームのマッピングの例

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

これは、外部のログイン プロバイダーから提供された情報を読み取り、ログオンしたユーザーのプロファイルに保存するユーザー サインイン スクリプトの例です。

ユース ケース

外部ログイン プロバイダーは、ログオンしたユーザーに関する情報をクレームの形式で提供します。提供されるクレームは、使用するログイン プロバイダーに大きく依存します。

この例は、ログイン プロバイダーとして Google を使用して開発されています。Google は、givenname および surname という 2 つのクレームを提供します。M.UserProfile エンティティ定義には、FirstName および LastName という 2 つのプロパティが含まれると仮定します。このスクリプトは、givenname および surname クレームの値をこれらのプロパティにマッピングします。

注意

「FirstName」および「LastName」プロパティは、最初から用意されているわけではありません。スキーマエディターを使用して追加されています。

スクリプト

using System.Linq;
using System.Security.Claims;

if (Context.ExternalUserInfo?.Claims == null) return;

var firstName = Context.ExternalUserInfo.Claims.FirstOrDefault(c => c.Type == ClaimTypes.GivenName)?.Value;
var lastName = Context.ExternalUserInfo.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Surname)?.Value;

if (string.IsNullOrEmpty(firstName) && string.IsNullOrEmpty(lastName)) return; // No first or lastname claims found, nothing to do.

var userToUserProfile = await Context.User.GetRelationAsync<IParentToOneChildRelation>("UserToUserProfile");
if (!userToUserProfile.Child.HasValue) throw new InvalidOperationException("The logged on user has no user-profile.");

var profile = await MClient.Entities.GetAsync(userToUserProfile.Child.Value); 
if (profile == null) throw new InvalidOperationException("The logged on user has no user-profile.");

if (!string.IsNullOrEmpty(firstName))
{
profile.SetPropertyValue("FirstName", firstName);
}

if (!string.IsNullOrEmpty(lastName))
{
profile.SetPropertyValue("LastName", lastName);
}

await MClient.Entities.SaveAsync(profile);

スクリプトの説明

  1. スクリプトで使用するライブラリをインクルードします。

    using System.Linq;
    using System.Security.Claims;
  2. ユーザーは、Basic 認証 (ユーザー名とパスワード) または外部のログイン プロバイダーのいずれかを使用してログインできます。ユーザーが Basic 認証を使用してログオンしている場合、Context.ExternalUserInfo は null になります。この場合、マッピングするクレームはないので、何もせずにスクリプトから戻ります。

    if (Context.ExternalUserInfo?.Claims == null) return;
  3. 提供されたクレームから値を抽出します。クレームは、「ClaimTypes」クラスの定数として定義されています。

    var firstName = Context.ExternalUserInfo.Claims.FirstOrDefault(c => c.Type == ClaimTypes.GivenName)?.Value;
    var lastName = Context.ExternalUserInfo.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Surname)?.Value;
  4. givenname または surname クレームが提供されていない場合は、マッピングする対象がないため、スクリプトから戻ります。

    if (string.IsNullOrEmpty(firstName) && string.IsNullOrEmpty(lastName)) return;
  5. ログオンしたユーザーに関連するユーザー プロファイルをロードする必要があります。ログオンしたユーザーは Context.User で指定されます。ユーザー プロファイルは、「UserToUserProfile」リレーションを使用してユーザーに関連付けられます。システム内のすべてのユーザーは、プロファイルが関連付けられているものと予期されます。ユーザー プロファイルが見つからない場合は問題が発生し、例外がスローされます。

    var userToUserProfile = await Context.User.GetRelationAsync<IParentToOneChildRelation>("UserToUserProfile");
    if (!userToUserProfile.Child.HasValue) throw new InvalidOperationException("The logged on user has no user-profile.");
    
    var profile = await MClient.Entities.GetAsync(userToUserProfile.Child.Value); 
    if (profile == null) throw new InvalidOperationException("The logged on user has no user-profile.");
  6. プロファイル エンティティの「FirstName」プロパティと「LastName」プロパティにデータを入力します。いずれかのクレームが提供されていない場合は、単にスキップしてください。

    if (!string.IsNullOrEmpty(firstName))
    {
    profile.SetPropertyValue("FirstName", firstName);
    }
    
    if (!string.IsNullOrEmpty(lastName))
    {
    profile.SetPropertyValue("LastName", lastName);
    }
  7. ユーザー プロファイルに加えられた変更をデータベースに保存します。

    await MClient.Entities.SaveAsync(profile);

設定

  • ユーザー サインイン スクリプトを作成し、パブリッシュして有効にします。
この記事を改善するための提案がある場合は、 お知らせください!