0

我正在嘗試在需要編輯功能的網頁中使用公共Google日曆。 爲此,我創建了日曆並將其公開。然後我創建了一個Google服務帳戶和相關的客戶端ID。 我也啓用了日曆API,並將v3 dll添加到項目中。 我下載了p12證書,這就是問題出現的時間。Google日曆API和共享主機問題

對Google的調用需要X509證書,但.NET框架的構建方式是使用用戶臨時文件夾。 由於它是Web服務器(GoDaddy)的共享主機,因此我無法修改應用程序池標識。 其結果是,我得到這個錯誤:

System.Security.Cryptography.CryptographicException: The system cannot find the file specified.

打電話時:

X509Certificate2 certificate = new X509Certificate2(GoogleOAuth2CertificatePath, 
       "notasecret", X509KeyStorageFlags.Exportable); 

即cerificate VAR然後在谷歌通話使用:

ServiceAccountCredential credential = new ServiceAccountCredential(
       new ServiceAccountCredential.Initializer(GoogleOAuth2EmailAddress) 
       { 
        User = GoogleAccount, 
        Scopes = new[] { CalendarService.Scope.Calendar } 
       }.FromCertificate(certificate)); 

。 ..但我從來沒有那麼遠。

問:有沒有辦法以不同的方式進行調用,即不使用X509證書,而使用JSON? 或者我可以讓x509函數使用一般臨時位置而不是我無法訪問的用戶位置,因爲我無法更改應用程序池中的身份?

由於我完全卡住了,任何幫助,將不勝感激。

+0

肯定使用JSON,你會遇到同樣的問題 - 問題是「我無法加載文件」,而不是Google或X509特定的問題。您可以將證書嵌入到程序集中並使用'Assembly.GetManifestResourceStream'來加載數據... –

+0

同意你在哪裏放置GoogleOAuth2CertificatePath? – DaImTo

+0

.p12文件位於App_Data/MyGoogleStorage文件夾中。 – Nick

回答

0

避免需要擔心文件位置的一個簡單選項是將證書嵌入到程序集中。在Visual Studio中,右鍵單擊該文件並顯示其屬性。在構建操作下,選擇「嵌入式資源」。

然後,您應該能夠使用的東西加載數據是這樣的:

// 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」項目類型...取決於您正在使用的確切項目類型,您可能需要調整它。

+0

這是一個網頁項目,所以我沒有選擇嵌入文件,或者我?我在VS2012中唯一的屬性是文件名和本地路徑 – Nick

+0

@Nick:您不清楚您的描述中使用了哪種項目。你可能會把它放到一個單獨的類庫中...或者升級到使用更全功能的Web項目... –

+0

該網站是一個.net 4.5 web應用程序 – Nick