我试图在需要编辑功能的网页中使用公开的Google日历。 为此,我创建了日历并将其公之于众。然后,我创建了一个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调用中使用cerificate var:
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(GoogleOAuth2EmailAddress)
{
User = GoogleAccount,
Scopes = new[] { CalendarService.Scope.Calendar }
}.FromCertificate(certificate));
......但我从来没有那么远。
问题:有没有办法以不同的方式拨打电话,即不使用X509证书而是使用JSON? 或者我可以使用x509函数来使用常规临时位置而不是我无法访问的用户位置,因为我无法更改应用程序池中的标识吗?
由于我完全陷入困境,所以我们将不胜感激。
答案 0 :(得分:0)
避免需要担心文件位置的一个简单选项是将证书嵌入到程序集中。在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”项目类型...根据您正在使用的完全项目类型,您可能需要调整它。