【发布时间】:2021-12-04 17:58:48
【问题描述】:
问题
我在 GCR 上运行一个 ASP Core 应用程序,需要检索当前的 ServiceAccountCredential 才能签署 url。显而易见的方法是:
var credential = GoogleCredential.GetApplicationDefault();
var serviceCred = (ServiceAccountCredential)credential.UnderlyingCredential;
var urlSigner = UrlSigner.FromServiceAccountCredential(serviceCred);
与我的预期相反,GoogleCredential.GetApplicationDefault 返回的 UnderlyingCredential 是一个实例 ComputeCredential(即使 GCR 服务运行在我专门为此目的创建的服务帐户上)。
结果是引发了InvalidCastException,并带有错误消息:Unable to cast object of type 'Google.Apis.Auth.OAuth2.ComputeCredential' to type 'Google.Apis.Auth.OAuth2.ServiceAccountCredential'。
解决方法
作为一种解决方法,我为服务帐户创建了一个密钥,将其存储在秘密管理器中,并改为使用它:
var credential = GoogleCredential.FromJson(credJson);
var serviceCred = (ServiceAccountCredential)credential.UnderlyingCredential;
var urlSigner = UrlSigner.FromServiceAccountCredential(serviceCred);
解决办法?
虽然该解决方法有效,但我宁愿根本不创建密钥,只是为了避免将密钥放在周围。有没有合适的解决方案可以用来检索当前的ServiceAccountCredential?或者,否则,使用ComputeCredential 对网址进行签名?
【问题讨论】:
标签: c# google-cloud-run service-accounts google-iam google-cloud-iam