2017-04-12 12 views
1

これはとても簡単なことだと思うけど、今一週間以上これを理解しようとしていて、それを理解できないようだ。 WinJSを使用してWindows UWPアプリケーションを作成しており、ユーザーがPIV(スマートカード)/ PINの組み合わせでアプリにログインするようにしたいと考えています。基本的に、アプリケーションが起動すると、デバイスにスマートカードが挿入されていることを確認し、ユーザーにPINを入力するよう促します。 PINがスマートカードに対して有効であれば、アプリはユーザーをログインさせます。スマートカードWindows UWPアプリのユーザーログイン

現在のところWindows 7のアプリケーションがありますが、このコードを変換しようとしましたが、使用したAPIはWindows用ではありませんUWPアプリ。私はそれらのAPIに関する質問を投稿しましたが、何の応答も受けませんでした(https://stackoverflow.com/questions/43344679/x509certificate2ui-class-equivalent-with-windows-uwp-and-winjs)。 Windows 7では、X509Certificate2UI(https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2ui(v=vs.110).aspx)クラスを使用して、ユーザーにPINを入力する証明書を選択しました。

多くの研究の後、私はWindows UWPで信じている(間違っているかもしれない)スマートカードAPI(https://docs.microsoft.com/en-us/uwp/api/windows.devices.smartcards)を使う必要がある。私はこの数日前の記事を読んでいて、このようなスマートカードに関するいくつかのマイクロソフトの文書を調べましたが、スマートカードのPINに対してユーザーが入力したPINを検証する方法を見つけることができませんでした。

スマートカードプロビジョニングクラス(https://docs.microsoft.com/en-us/uwp/api/windows.devices.smartcards.smartcardprovisioning)からrequestPinChangeAsync()メソッドを呼び出して、現在のPINと新しいPINを入力するように促すことができます。私は、現在のPINを尋ねるだけで、PINが正しいかどうかをアプリに知らせる値を返すという点を除いて、同様の機能を探しています。

私はMicrosoftのHello(https://docs.microsoft.com/en-us/windows/uwp/security/microsoft-passport)APIも読んでいますが、スマートカードで使用する方法は見当たりませんでした。

私のアプリでスマートカード/ PINの組み合わせを使用して二要素認証を使用する方法について、誰かが正しい方向に向けることができます。私は過去数日間、Googleバブルの中でラウンド・アンド・ラウンドしていて、出かけるのに助けが必要なようです。

おかげ

それが重複していない理由を説明するには、[編集]: そうでもないの重複、両方の質問は、私が尋ねたと私は質問のBODで他のポストに言及しました。もう1つの記事では、WinJSを使用したWindows UWPのX509Certificate2UIクラスに相当するものを探していました。さらなる研究では、私はこの記事で正しい方法ではないかもしれないと思っています。誰かがPIV(スマートカード)とPINを使って二要素認証をする正しい方向を指すことができるかどうかを見たいと思っていますカードに関連付けられています。

編集:動作するコードのコード: これはうまくいくように見えるWinJSコードです。確かに良い方法があるかわからない:

if (certToUse != null) { 
    Windows.Security.Cryptography.Core.PersistedKeyProvider.openKeyPairFromCertificateAsync(certToUse, Windows.Security.Cryptography.Core.HashAlgorithmNames.sha256, Windows.Security.Cryptography.Core.CryptographicPadding.rsaPkcs1V15).then(function (keyPair) { 
     var buffer = 'data to sign' 
     var data = Windows.Security.Cryptography.CryptographicBuffer.convertStringToBinary(buffer, Windows.Security.Cryptography.BinaryStringEncoding.utf16BE) 
     Windows.Security.Cryptography.Core.CryptographicEngine.signAsync(keyPair, data).then(function (signed) { 
     var results = Windows.Security.Cryptography.Core.CryptographicEngine.verifySignature(keyPair, data, signed) 
      completeValidatePin = true 
      successCallback(true) 
     }, function (reason) { 
      completeValidatePin = true 
      errorCallback('User cancelled login') 
     }) 
    }, function (reason) { 
     completeValidatePin = true 
     errorCallback('Error using certificate') 
    }) 
    } else { 
    errorCallback('Certificate not found') 
    } 
+0

[Windows UWPおよびWinJSと同等の[X509Certificate2UIクラス]の可能な複製](http:// stackoverflow。com/questions/43344679/x509certificate2ui-class-equivalent-with-windows-uwp-and-winjs) –

+0

本当に重複していない、両方の質問が私から聞かれました。もう1つの記事では、WinJSを使用したWindows UWPのX509Certificate2UIクラスに相当するものを探していました。さらなる研究では、私はこの記事で正しい方法ではないかもしれないと思っています。誰かがPIV(スマートカード)とPINを使って二要素認証をする正しい方向を指すことができるかどうかを見たいと思っていますカードに関連付けられています。 –

+0

いいえ、私はそのサンプルを通過しましたが、証明書を要求してユーザーが入力したPINを検証する特定の方法はありません。このサンプルでは、​​PINを変更してリセットする方法のみを示しています。 –

答えて

0

私は現在あなたの質問を調査し、良い解決策があるかどうかを判断しようとしています。

私が動作するはずと思った次のコードを書いた:CryptographicEngine.Signは、PINダイアログを表示することができませんので、残念ながら

IReadOnlyList<Certificate> Certs; 
CertificateQuery CertQuery = new CertificateQuery(); 
CertQuery.HardwareOnly = true; 

Certs = await CertificateStores.FindAllAsync(CertQuery); 
string strEncrypt = "test"; 
IBuffer BufferToEncrypt = CryptographicBuffer.ConvertStringToBinary(strEncrypt, BinaryStringEncoding.Utf8); 

foreach (Certificate Cert in Certs) 
{ 
    if (Cert.HasPrivateKey && ((Cert.KeyStorageProviderName == "Microsoft Base Smart Card Crypto Provider") || Cert.KeyStorageProviderName == "Microsoft Smart Card Key Storage Provider")) 
    { 
     CryptographicKey Key = null; 

     try 
     {       
      Key = await PersistedKeyProvider.OpenKeyPairFromCertificateAsync(Cert, HashAlgorithmNames.Sha1, CryptographicPadding.RsaPkcs1V15);       

     } 
     catch (Exception ex) 
     { 
      // Could not open Smart Card Key Pair 
     } 

     if (Key != null) 
     { 
      try 
      {       
       // Try to Sign with Cert Private key 
       IBuffer EncryptedBuffer = CryptographicEngine.Sign(Key, BufferToEncrypt); 
      } 
      catch (Exception ex) 
      { 
       // Could not sign        
      } 
     } 
    } 
} 

を、OpenKeyPairFromCertificateAsyncはサイレントコンテキストを持つプロバイダを作成します。私はもう少しそれを調べなければならないでしょう。

関連する問題