Я пытаюсь сгенерировать CSR из смарт-карты, используя библиотеку CertEnroll :: CX509CertificateRequestPkcs10. Это работает нормально, если я просто запускаю его в начале. Однако, если я запускаю поток входа в систему ADAL раньше, я получаю следующую ошибку
CertEnroll :: CX509CertificateRequestPkcs10 :: Код: Неверный дескриптор окна. 0x80070578 (WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE)
Я посмотрел на ошибку, и кажется, что это причина, когда вы вызываете окно, которое больше не существует. Так как я не могу контролировать, какое окно вызывает CertEnroll :: CX509CertificateRequestPkcs10 :: Encode, есть ли способ очистить указатели или что-то, чтобы избежать этой ошибки?
для справки вот мой регистрационный код
var request = new CX509CertificateRequestPkcs10();
request.Initialize(X509CertificateEnrollmentContext.ContextUser);
request.PrivateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_NONE;
request.PrivateKey.Length = 2048;
request.PrivateKey.ProviderName = "Microsoft Base Smart Card Crypto Provider";
request.PrivateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_SIGNING_FLAG;
request.PrivateKey.KeySpec = X509KeySpec.XCN_AT_KEYEXCHANGE;
request.PrivateKey.MachineContext = false;
if (!subjectName.StartsWith("CN="))
subjectName = $"CN={subjectName}";
var subjectEncoded = new CX500DistinguishedNameClass();
subjectEncoded.Encode(subjectName);
request.Subject = subjectEncoded;
request.Encode();
и вот мой код аутентификации
result = authContext.AcquireTokenAsync(ResourceId, clientId, redirectUri, new PlatformParameters(PromptBehavior.Always));
result.Wait();
_userName = result.Result.UserInfo.DisplayableId;
return result.Result.AccessToken;