本コラムも、ようやく最後のパートとなりました。前回はサンプルWebアプリ経由でVCを発行させてみました。今回は、写真情報をWebアプリにアップロードし、これを含めたVC発行と検証を行います。
VC資格情報に顔認証を含める
Microsoftサンプルアプリですが、実は顔認証データを含めることができます。顔認証を含めることで、本人証明の精度を圧倒的に向上させることができます。Entra Verified IDでは顔認証がサポートされており、これを有効化することで、機能を利用することができます。
Entra Verified ID資格情報の改修
まず、Entra Verified ID資格情報の改修を行います。[確認済みID]- [VerifiedCredentialExpert]-[プロパティ]から[表示の定義]および[ルールの定義]を以下のように書き換えます。
[表示の定義]
{
"locale": "en-US",
"card": {
"backgroundColor": "#000000",
"description": "Use your verified credential to prove to anyone that you know all about verifiable credentials.",
"issuedBy": "Microsoft",
"textColor": "#ffffff",
"title": "Verified Credential Expert",
"logo": {
"description": "Verified Credential Expert Logo",
"uri": "https://didcustomerplayground.z13.web.core.windows.net/VerifiedCredentialExpert_icon.png"
}
},
"consent": {
"instructions": "Sign in with your account to get your card.",
"title": "Do you want to get your Verified Credential?"
},
"claims": [
{
"claim": "vc.credentialSubject.firstName",
"label": "First name",
"type": "String"
},
{
"claim": "vc.credentialSubject.lastName",
"label": "Last name",
"type": "String"
},
{
"claim": "vc.credentialSubject.photo",
"label": "User picture",
"type": "image/jpg;base64url"
}
]
}
[ルールの定義]
{
"attestations": {
"idTokenHints": [
{
"mapping": [
{
"outputClaim": "firstName",
"required": true,
"inputClaim": "$.given_name",
"indexed": false
},
{
"outputClaim": "lastName",
"required": true,
"inputClaim": "$.family_name",
"indexed": true
},
{
"outputClaim": "photo",
"required": false,
"inputClaim": "photo",
"indexed": false
}
],
"required": false
}
]
},
"validityInterval": 2592000,
"vc": {
"type": [
"VerifiedCredentialExpert"
]
}
}
Microsoftサンプルアプリの改修
次に、サンプルアプリの改修を行います。Visual Studio Codeでローカル上の[ACTIVE-DIRECTORY-VERIFIABLE-CREDENTIALS-DOTNET]フォルダーを開き、[1-asp-net-core-api-idtokenhint]-[IssureController.cs]を開きます。IssureController.cs の以下項目を書き換えてセーブします。
private IssuanceRequest SetClaims( IssuanceRequest request ) {
request.claims = new Dictionary();
request.claims.Add( "given_name", "[名前]" );
request.claims.Add( "family_name", "[苗字]" );
string photoClaimName = "photo";
// get photo claim from manifest
if (GetCredentialManifest( out string manifest, out string error )) {
JObject jsonManifest = JObject.Parse(manifest);
foreach( var claim in jsonManifest["display"]["claims"] ) {
string claimName = ((JProperty)claim).Name;
if (jsonManifest["display"]["claims"][claimName]["type"].ToString() == "image/jpg;base64url" ) {
photoClaimName = claimName.Replace( "vc.credentialSubject.", "");
}
}
}
}
Entra Verified ID顔認証機能を有効化
最後に、Entra Verified IDの顔認証機能を有効化します。[確認済みID]-[概要]-[概要]-[アドオン]から[顔チェック]を有効化します。1トランザクション $0.25の追加費用が発生します。
この改修については、Combat impersonation using Face Check with Microsoft Entra Verified ID | Microsoft Entra Identity Platformに説明がありますので、参考になると思います。
VC資格情報の発行(顔認証含む)
改修が完了したら、Visual Studio Codeでデバッグ実行を行い、ngrokで公開を行うとアプリが表示されます。
[Take Selfie]を選択し、現れた二次元コードを「スマホのカメラで」読み込むことで、セルフィー写真をアップロードできます。
写真がアップロードされた状態で[Issue Credential]をクリックすると、再び二次元コードが現れます。Microsoft Authenticatorで読み取るとVCが発行されます。
アップロードしたセルフィー写真がVCに含まれています。VC検証の際にはこの写真データを基に検証が行われます。
VC資格情報の検証(顔認証含む)
VC検証で顔認証が必要な場合ですが、操作は前回と同じですが、[Use FaceCheck]項目にチェックを入れる必要があります。
成功するとVCの詳細情報が、表示されます。前回の情報(氏名は違いますが)だけでなく、顔写真情報が追加されていることがわかります。
Authenticator側のVCでも、検証の成功が記録されています。テキスト情報(氏名)と生体認証(顔認証)の両方が合格していることがわかります。
ちなみに筆者は眼鏡をかけてセルフィーを撮りましたが、眼鏡をはずしてVCの検証を行った場合も、特に問題はありませんでした。顔情報の取得が困難(明るすぎる・揺れる等)な場合は、精緻な顔情報の確認が行われます。その結果問題がなければ、検証は成功となります。
ちなみに顔認証では「精度」を設定できます。デフォルトでは70%の精度ですが、50~100%の割合で変更が可能です。今回のMicrosoftサンプルアプリでは、[appsettings.json]のmatchConfidenceThresholdプロパティで設定されています。
ちなみに、matchConfidenceThresholdを70 → 100に変更し、写真と違う表情を付けた顔(変顔)で検証したところ「顔がVerified IDと一致しません」と記録され、失敗しました。表情とスコアが関係するのかしら?と思い、matchConfidenceThresholdを70 → 50に変更し、同様の顔(変顔)で検証したところ、なんとこちらも失敗してしまいました。
VCの検証結果のログを確認すると「Failed Face Check Liveness check.」と表示されており、(表情がつく等)顔認証の基本要件を満たしていないため、認証データが無効になってしまったのだとわかります。
ではどんな時にこのしきい値は有効になるのか?ですが、顔認証の際に「同僚に代わりに」顔を出してもらったところ、検証結果は「顔がVerified IDと一致しません」と記録されるのですが、ログを確認すると「Failed Face Check Match Check-confidence score failed to meet the minimum confidence threshold.」と表示されており、「顔チェックスコアがしきい値以下なので失敗した」ことがわかります。顔チェックをスコア化している事実が確認できました。
VCのこれから
Microsoft Entra Verified IDについては、要領がわかれば比較的簡単にVCの発行や検証が行えることがわかりました。特に「雇用証明」については、Microsoftでひな形を用意しており、Entra IDに登録されたユーザーであれば、気軽にVC資格発行の発行が可能です。
今回は検証していませんが、この形態(クイックセットアップ)での顔認証も簡単にできますので、本人確認も同時に行うことができます。ユースケースにもありましたが、[従業員確認]+[ベンダー・公的資格確認]+[本人確認]のVCを企業が発行できれば、公的資格の保証を利用者プロファイルに組み込めて、便利です。
ちなみにMicrosoft Entra エンタイトルメント管理という、Entra IDアカウントのライフサイクル管理を行うソリューションがあるのですが、この中でVCを使ったアクセス許可管理(アクセスパッケージ)を定義することができ、特定のVCを提示するユーザーだけ管理的操作を行うことができる、等が行えます。
VC資格情報の定義については、ひな形となるJSONは公開されており、いろいろな種類があることがわかります。
チュートリアル - ディレクトリ ベースの要求に対して Microsoft Entra 確認済み ID 資格情報を発行する - Microsoft Entra Verified ID | Microsoft Learn
ID トークン ヒントの検証可能な資格情報を作成する - Microsoft Entra Verified ID | Microsoft Learn
ID トークンの検証可能な資格情報を作成する - Microsoft Entra Verified ID | Microsoft Learn
既存の検証可能な資格情報からの要求を提示して、検証可能な資格情報を発行する - Microsoft Entra Verified ID | Microsoft Learn
セルフアサート要求の検証可能な資格情報を作成する - Microsoft Entra Verified ID | Microsoft Learn
複数の構成証明を使って検証可能な資格情報を作成する - Microsoft Entra Verified ID | Microsoft Learn
こういったVerifiable Credentialsの仕様をふまえて、アプリ開発者は適切なVC発行のスキーム(想定されたルール)を決定していく必要があります。
またVCの検証についてですが、検証アプリは検証時に、必要な属性の提示を要求します。利用者(wallet)はその要求に許可を与えるスタイルになります(検証では「共有する」という文言になります)。一般的にはアプリ側で考慮済みとは思いますが、利用者側でも「要求してくる属性情報」に敏感になり、必要以上の情報開示は行わないことが必要かと思います。そのためにVCの仕組みや利用上のポイントについて、リテラシーをあげていく必要がある、という風に思われます。
おりしもiPhoneでのマイナンバーカードが2025年6月から導入されました(iPhoneのマイナンバーカード | デジタル庁 ウェブサービス・アプリケーション)。マイナンバーカードはVCの一種ですので、今後は公的手続きを中心に「IC化による省力化」「選択的情報開示によるプライバシー保護」などが期待できます。もちろんVCですので民間でも活用可能ですが、それはこれから充実させていく、ということのようです。
マイナンバーカードVCに関しては、残念ながら派生VCは認めないという政府ガイドラインがあるようで、VC発行の実装はマイナンバーアプリに依存するようです。民間の発行VCの派生が行われるかどうかはわかりませんが、高い柔軟性をふまえた実装と運用が行われるのであれば、いろんな方がシアワセになるのかぁ、と思います。将来的には、お財布がカードで膨らむように、VCでwalletがパンパン...になるかもしれませんね。
さいごに
長きにわたって本コラムにお付き合いいただき、読者の方には感謝申し上げます。VCに関して今回のような内容は、他でも紹介されていたりするのですが、実際に自分で検証を行うことで、動作そのものの理解が深まりました。発展途上のVCではありますが、引き続き動静を見守っていきたい、と考えています。最後までご覧いただき、ありがとうございました。
- ※文中の商品名、会社名、団体名は、一般に各社の商標または登録商標です。





























