Can';t使用C#/.NET中的服务帐户在Google drive中授权

Can';t使用C#/.NET中的服务帐户在Google drive中授权,c#,.net,certificate,google-drive-api,google-api-dotnet-client,C#,.net,Certificate,Google Drive Api,Google Api Dotnet Client,我正在尝试从Windows应用程序或服务使用Google drive 我不需要Web应用程序、MVC等等 系统必须自动工作,没有任何用户入侵,所以我创建了服务帐户,并获得证书和电子邮件 当然,最后下载的客户端库- 我按照文档中的方式构建服务对象: private const string SERVICE_ACCOUNT_EMAIL = "xxx@developer.gserviceaccount.com"; private const string SERVICE_ACC

我正在尝试从Windows应用程序或服务使用Google drive

我不需要Web应用程序、MVC等等

系统必须自动工作,没有任何用户入侵,所以我创建了服务帐户,并获得证书和电子邮件

当然,最后下载的客户端库-

我按照文档中的方式构建服务对象:

        private const string SERVICE_ACCOUNT_EMAIL = "xxx@developer.gserviceaccount.com";
    private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"xxx-privatekey.p12";

    /// <summary>
    /// Build a Drive service object authorized with the service account.
    /// </summary>
    /// <returns>Drive service object.</returns>
    static DriveService BuildService ( )
    {
        X509Certificate2 certificate = new X509Certificate2 ( SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret",
            X509KeyStorageFlags.Exportable );

        var provider = new AssertionFlowClient ( GoogleAuthenticationServer.Description, certificate )
        {
            ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
            Scope = DriveService.Scopes.Drive.GetStringValue ( ),
            ServiceAccountUser = "myemail@gmail.com",
        };
        var auth = new OAuth2Authenticator<AssertionFlowClient> ( provider, AssertionFlowClient.GetState );
        return new DriveService ( auth );
    } // BuildService
我在Upload方法中遇到异常-未知对象标识符(OID)。 我找到了引发此异常的命令:

字符串签名=unpadderlSAFEBASE64encode(Key.SignData(Encoding.ASCII.GetBytes(assertion.ToString()),“SHA256”)

这是在Google.api.Authentication.OAuth2.dll、文件AssertionflowClient.cs、方法GenerateMessage中实现的

但谷歌证书只有SHA1算法。这可以从证书信息窗口中看到:X509Certificate2UI.DisplayCertificate(证书);或者从窗口

我尝试使用SHA1: 字符串签名=unpadderlSAFEBASE64encode(Key.SignData(Encoding.ASCII.GetBytes(assertion.ToString()),“SHA1”)

之后,这个异常消失了,但我得到了HTTP错误400(无效请求)。
如何使用服务帐户使用Google drive?

您是否按照第页中的说明生成了新密钥

您可以尝试其他服务请求吗,比如说插入请求而不上载媒体(InsertRequest Insert(Google.api.Drive.v1.Data.File body)),如果其他方法对您不起作用,请告诉我

请注意,在中,它说:“服务帐户依赖RSA SHA256算法和JWT令牌格式”。这是受支持的算法,而不是SHA1。

在代码中删除

ServiceAccountUser = "myemail@gmail.com",
或 转到谷歌应用程序域的管理控制台并授权您的服务帐户


然后它就工作了。

在我的例子中,当我尝试使用BuildService()获取文件时它不返回任何数据。请帮我解决这个问题。这些文件是否共享到服务帐户?此服务帐户机制主要用于google企业应用程序。如果您在个人驱动器上使用这些API,您可能必须显式地将这些文件共享到服务帐户。在我的情况下,当我尝试使用BuildService()获取文件时没有返回数据。你能帮我吗。
ServiceAccountUser = "myemail@gmail.com",