我试图在一个需要编辑功能的网页中使用公共谷歌日历。为此,我创建了日历并将其公开。然后,我创建了一个Google服务帐户和相关的客户端id。我还启用了Calendar API,并将v3 dll添加到项目中。我下载了p12证书,这就是问题开始的时候。
对Google的调用使用X509证书,但. net框架的构建方式是使用用户临时文件夹。由于它是web服务器(GoDaddy)的共享主机,我无法修改应用程序池身份。结果,我得到了这个错误:
System.Security.Cryptography。CryptographicException:系统不能查找指定的文件
当调用:
X509Certificate2 certificate = new X509Certificate2(GoogleOAuth2CertificatePath,
"notasecret", X509KeyStorageFlags.Exportable);
证书变量将在Google调用中使用:
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(GoogleOAuth2EmailAddress)
{
User = GoogleAccount,
Scopes = new[] { CalendarService.Scope.Calendar }
}.FromCertificate(certificate));
…但我从来没有走到那一步。
问题:是否有一种方法可以使呼叫不同,即不使用X509证书,而是使用JSON ?或者我可以让x509函数使用一般的临时位置,而不是我无法访问的用户位置,因为我无法更改应用程序池中的身份?
由于我完全卡住了,任何帮助都将是感激的。
避免担心文件位置的一个简单选项是将证书嵌入到程序集中。在Visual Studio中,右键单击文件并显示其属性。在Build Action下,选择"Embedded resource"
你应该能够像这样加载数据:
// In a helper class somewhere...
private static byte[] LoadResourceContent(Type type, string resourceName)
{
string fullName = type.Namespace + "." + resourceName;
using (var stream = type.Assembly.GetManifestResourceStream(fullName)
{
var output = new MemoryStream();
stream.CopyTo(output);
return output.ToArray();
}
}
:
byte[] data = ResourceHelper.LoadResourceContent(typeof(MyType), "Certificate.p12");
var certificate = new X509Certificate2(data, "notasecret", X509KeyStorageFlags.Exportable);
这里的MyType
是与你的资源在同一个文件夹中的某种类型。
注意,在。net中有很多不同的"web"项目类型…根据所使用的项目类型的不同,您可能需要调整这个