「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
if (await KeyCredentialManager.IsSupportedAsync() == false)
{
・・・
当該ユーザ&アプリケーションのキーのストア&コンテナを開く。
// retrieve private key for sign
KeyCredentialRetrievalResult res =
await KeyCredentialManager.OpenAsync("keyName");
if (res.Status == KeyCredentialStatus.Success)
{
・・・
if (res.Status == KeyCredentialStatus.NotFound)
{
・・・
の場合、
// Create the credential
// (Windows Hello is diplayed here !)
KeyCredentialRetrievalResult createRes =
await KeyCredentialManager.RequestCreateAsync("keyName", KeyCredentialCreationOption.ReplaceExisting);
// if the status is success, retrieve the public key.
if (createRes.Status == KeyCredentialStatus.Success)
{
・・・public keyとattestationを取得する。
}
else if(
keyCreationResult.Status == KeyCredentialStatus.UserCanceled ||
keyCreationResult.Status == KeyCredentialStatus.UserPrefersPassword)
{
// Show error message to the user to get confirmation that user does not want to enroll.
}if (createRes.Status == KeyCredentialStatus.Success)
var userKey = keyCreationResult.Credential; var publicKey = userKey.RetrievePublicKey();
if (createRes.Status == KeyCredentialStatus.Success)
IBuffer keyAttestation = null;
IBuffer certificateChain = null;
bool keyAttesttionIncluded = false;
bool keyAttestationCanBeRetrievedLAter = false;
KeyCredentialAttestationResult keyAttestationResult = await userKey.GetAttestationAsync();
KeyCredentialAttestationStatus keyAttestationRetryType = 0;
if (keyAttestationResult.Status == KeyCredentialAttestationStatus.Success)
{
keyAttestationIncluded = true;
keyAttestation = keyAttestationResult.AttestationBuffer;
certificateChain = keyAttestationResult.CertificateChainBuffer;
}
else if (keyAttestationResult.Status == KeyCredentialAttestationStatus.TemporaryFailure)
{
keyAttestationRetryType = KeyCredentialAttestationStatus.TemporaryFailure;
keyAttestationCanBeRetrievedLater = true;
}
else if (keyAttestationResult.Status == KeyCredentialAttestationStatus.NotSupported)
{
keyAttestationRetryType = KeyCredentialAttestationStatus.NotSupported;
keyAttestationCanBeRetrievedLAter = true;
}上記のKeyCredentialManager.OpenAsyncの結果が、
if (res.Status == KeyCredentialStatus.Success)
{
・・・
の場合、
登録後、PIN や 生体認証を使って、challengeにデジタル署名 (RequestSignAsync?) する。
var openKeyResult = await KeyCredentialManager.OpenAsync(AccountId);
if (openKeyResult.Status == KeyCredentialStatus.Success)
{
var userKey = openKeyResult.Credential;
var publicKey = userKey.RetrievePublicKey();
var signResult = await userKey.RequestSignAsync(message);
if (signResult.Status == KeyCredentialStatus.Success)
{
return signResult.Result;
}
else if (signResult.Status == KeyCredentialStatus.UserPrefersPassword)
{
}
}
ある特定の箇所で 生体認証を呼び出してOKかNOか確認したい場合
if (await UserConsentVerifier.CheckAvailabilityAsync() ==
UserConsentVerifierAvailability.Available)
{
UserConsentVerificationResult res =
await UserConsentVerifier.RequestVerificationAsync(
"This is sensitive operation ! Please authenticate again.");
if(res == UserConsentVerificationResult.Verified)
{
// some important action …
}
}
private keyを削除する。
await KeyCredentialManager.DeleteAsync("keyName");
UserKeys?レコードを追加。
using (RSACng pubKey = new RSACng(publicKey))
{
retval = pubKey.VerifyData(
originalChallenge, responseSignature,
HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
Tags: :認証基盤