cordova插件x509store

我必须开发一个主要针对Windows平台的cordova应用程序。 在这个应用程序,我不得不操纵authentication商店。 长话短说,我必须做一个cordova插件(或者也许是一个activeX技巧)。 我在C#中创build了一个Windows运行时组件,如下所述,使用X509Store(因为我需要Windows)。 我用visual studio 2015做一个Windows运行时组件项目(我试过通用的Windows和8.1)。 它的工作原理,我可以在我的.js中调用C#方法。

但问题是:一个Windows运行时组件项目没有命名空间System.Security.Cryptography.X509Certificates。 所以我无法访问X509Store。

作为一种解决方法,我创build了一个调用X509Store并返回string的类库(.NetCore,.dll),至less要显示证书(json stringify)。 一个经典的类库也可以访问x509store,但是当我在这个windows运行时组件项目中引用它时会导致目标错误。 (一个便携式/通用的dll项目都没有X509Store)。 我的.netcore DLL的工作原理,我在一个控制台应用程序(.NetCore)项目中试过,它显示了我所有的证书。 但是,当我从cordova应用程序(cordova应用程序 – >插件 – >运行时 – > .netcore DLL)调用它是空的(没有find证书,并且当前用户未定义)。 我认为这是因为执行上下文不一样(webapp vs控制台应用程序)。 我不认为这是一个很好的解决scheme(甚至不工作)。

那么,如何才能访问Windows运行时组件中的(Windows用户的)authentication存储? 因为我不认为这是可能的JavaScript。

谢谢

PS:如果需要,我可以提供一些源代码

编辑:
我忘记了运行时项目与.netcore dll,我通过引用plugin.xml文件(System.Runtime.dll等..)中的正确的DLL解决了assembly冲突,因为我没有设法解决它视觉工作室

//script inside cordova, called after device ready signatureplugin.getAllCertNames(function(a) { }, function(a) { }, 0); //signatureplugin.js var exec = require('cordova/exec'); module.exports = { getAllCertNames: function(successCallback, errorCallback, args) { exec(successCallback, errorCallback, "SignaturePlugin", "getAllCertNames", [args]); } }; //signaturepluginProxy.js module.exports = { getAllCertNames: function(successCallback, errorCallback, args) { var res = SignerVerifier.PluginRT.getAllCertNames(); for (var i = 0, len = res.length; i < len; i++) { alert(res[i]); } } }; require("cordova/exec/proxy").add("SignaturePlugin", module.exports); //windows runtime component using CertStore; namespace SignerVerifier { public sealed class PluginRT { public static string[] getAllCertNames() { var certStore = new StoreManager(); var res = certStore.getAllCertificates(); return res; } } } //.NetCore dll using System.Collections.Generic; using System.Security.Cryptography.X509Certificates; using Newtonsoft.Json; using System; namespace CertStore { public class StoreManager { private X509Store store; public StoreManager() { store = new X509Store(StoreName.My, StoreLocation.CurrentUser); } public string[] getAllCertificates() { List<string> res = new List<string>(); store.Open(OpenFlags.ReadOnly); var certificates = store.Certificates; foreach (var cert in certificates) { res.Add(JsonConvert.SerializeObject(cert)); } store.Dispose(); return res.ToArray(); } } } 

如果我做一个JavaScript空白应用程序项目+ Windows运行时组件项目(项目从“通用”,我没有“Windows商店”,我使用Windows 10),然后添加.netcore DLL我得到了冲突,导致一个例外:

System.IO.FileLoadException:无法加载文件或程序集“System.Runtime,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”或其某个依赖项。 定位的程序集清单定义与程序集引用不匹配。 (来自HRESULT的exception:0x80131040)

(在cordova中,我通过引用System.Runtime.dll等来防止这个exception,从.netcore中使用的nuget包NETStandard.Library.1.6.0),我必须错过一些东西。 .NetCore DLL似乎不兼容,但Windows运行时项目目标.NetCore

编辑2 :(解决)
vcsjones的答案=解决方法没用(从以前的编辑没有问题)。 但是在任何情况下都存在安全问题,我必须在appxmanifest的Capabilities中检查“共享用户证书”

WinRT的证书管理不同于桌面和核心框架。 对于WinRT,您可以使用Windows.Security命名空间。

您可以使用Windows.Security.Cryptography.Certificates.CertificateStore类打开和管理证书存储。