C# 从系统帐户为用户创建ServiceAccountCredential

C# 从系统帐户为用户创建ServiceAccountCredential,c#,google-calendar-api,google-api-dotnet-client,C#,Google Calendar Api,Google Api Dotnet Client,我使用以下代码通过系统登录(域范围的身份验证)代表用户行事。我发现的唯一一个实现这一点的例子是使用反射来设置用户。我知道这不是实现这一点的正确方法,所以我想知道是否有人可以帮我举个例子,说明如何解决这个问题 ServiceAccountCredential credential = GoogleCredential.FromJson(GOOGLE_SYSTEM_USER_AUTH_INFORMATION) .CreateScoped(Scopes) .U

我使用以下代码通过系统登录(域范围的身份验证)代表用户行事。我发现的唯一一个实现这一点的例子是使用反射来设置用户。我知道这不是实现这一点的正确方法,所以我想知道是否有人可以帮我举个例子,说明如何解决这个问题

ServiceAccountCredential credential = 
    GoogleCredential.FromJson(GOOGLE_SYSTEM_USER_AUTH_INFORMATION)
        .CreateScoped(Scopes)
        .UnderlyingCredential as ServiceAccountCredential;

var userField = typeof(ServiceAccountCredential).GetField("user", 
BindingFlags.NonPublic | BindingFlags.Instance);
userField?.SetValue(credential, GOOGLE_CALENDAR_USERNAME); //Act in the guise of the normal user GOOGLE_CALENDAR_USERNAME


service = new CalendarService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = ApplicationName, 
});

下面是我的做法,通过
ServiceAccountCredential.Initializer同时设置作用域和新用户:

ServiceAccountCredential original = (ServiceAccountCredential)
    GoogleCredential.FromJson(GOOGLE_SYSTEM_USER_AUTH_INFORMATION).UnderlyingCredential;

var initializer = new ServiceAccountCredential.Initializer(original.Id)
{
    User = GOOGLE_CALENDAR_USERNAME,
    Key = original.Key,
    Scopes = Scopes
};
var credentialForUser = new ServiceAccountCredential(initializer);

现在,它为您提供了一个
ServiceAccountCredential
,而不是
GoogleCredential
。这就是您当前的代码所使用的,所以它应该没问题——但如果有一种简单的方法也能获得
GoogleCredential
,那就太好了。我们应该让这一切变得更简单——我已经同意了。

很有魅力。两个小错误,GOOGLE_CALENDAR_用户名和ServicAccountCredential错误后缺少逗号。