我正在与Google .Net 客户端库 https://github.com/google/google-api-dotnet-client。它的工作方式是,当用户想要向 Google 进行身份验证时,库会生成一个新网页供用户进行身份验证。
System.Diagnostics.Process.Start(authorizationUrl);
我使用该库的代码
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
scopes,
userName,
CancellationToken.None).Result;
如果我通过 Visual Studio 在本地运行它,它就可以正常工作。但是,如果我尝试部署它就会挂起。如果使用本地 IIS 使用 Visual Studio 运行它。我收到以下错误。
System.Exception:CreateServiceAccountAnalyticsReportingFailed --->
System.AggregateException:发生一个或多个错误。 --->
System.ComponentModel.Win32Exception:访问被拒绝
System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo
startInfo) 在 System.Diagnostics.Process.Start(ProcessStartInfo
开始信息)位于
Google.Apis.Auth.OAuth2.LocalServerCodeReceiver.d__6.MoveNext() 中
C:\Apiary\v1.22\google-api-dotnet-client\Src\Support\GoogleApis.Auth.DotNet4\OAuth2\LocalServerCodeReceiver.cs:line
89 --- 异常发生前一个位置的堆栈跟踪结束
抛出---在
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Google.Apis.Auth.OAuth2.AuthorizationCodeInstalledApp.d__8.MoveNext()
在
C:\Apiary\v1.22\google-api-dotnet-client\Src\Support\GoogleApis.Auth\OAuth2\AuthorizationCodeInstalledApp.cs:line
77 --- 异常发生前一个位置的堆栈跟踪结束
抛出---在
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__4.MoveNext()
在
C:\Apiary\v1.22\google-api-dotnet-client\Src\Support\GoogleApis.Auth.DotNet4\OAuth2\GoogleWebAuthorizationBroker.cs:line
134 --- 异常发生前一个位置的堆栈跟踪结束
抛出---在
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__1.MoveNext()
在
C:\Apiary\v1.22\google-api-dotnet-client\Src\Support\GoogleApis.Auth.DotNet4\OAuth2\GoogleWebAuthorizationBroker.cs:line
60 --- 内部异常堆栈跟踪结束 --- at
System.Threading.Tasks.Task`1.GetResultCore(布尔值
等待完成通知)在
WebApplication1.WebForm1.AuthenticateOauth(字符串 clientSecretJson,
字符串 userName) 在 C:\Users\daimto\Documents\Visual Studio 中
2015\Projects\WebApplication1\WebApplication1\index.aspx.cs:第 69 行
--- 内部异常堆栈跟踪结束 --- 在 WebApplication1.WebForm1.AuthenticateOauth(String clientSecretJson,
字符串 userName) 在 C:\Users\daimto\Documents\Visual Studio 中
2015\Projects\WebApplication1\WebApplication1\index.aspx.cs:第 83 行
WebApplication1.WebForm1.Page_Load(对象发送者,EventArgs e)中
C:\Users\daimto\Documents\Visual Studio
2015\Projects\WebApplication1\WebApplication1\index.aspx.cs:第 31 行
C:\inetpub\wwwroot\App_Data\MyGoogleStorage
我不是一个系统管理员类型的人,我对 IIS 知之甚少。我的猜测是 IIS 没有权限生成该进程?这只是一个猜测。我尝试过将应用程序池设置为使用我自己的个人帐户,我也尝试过网络系统。
客户端库上以下问题的链接
- Time https://github.com/google/google-api-dotnet-client/issues/898
- GoogleWebAuthorizationBroker.AuthorizeAsync 在 IIS 上托管时保持挂起状态 https://github.com/google/google-api-dotnet-client/issues/888
- Google Calendar Api-IIS 上的超时异常 https://github.com/google/google-api-dotnet-client/issues/726
该库支持另一种与 Web 应用程序一起使用的身份验证方式。
using System;
using System.Web.Mvc;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Util.Store;
namespace Google.Apis.Sample.MVC4
{
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "PUT_CLIENT_ID_HERE",
ClientSecret = "PUT_CLIENT_SECRET_HERE"
},
Scopes = new[] { DriveService.Scope.Drive },
DataStore = new FileDataStore("Drive.Api.Auth.Store")
});
public override string GetUserId(Controller controller)
{
// In this sample we use the session to store the user identifiers.
// That's not the best practice, because you should have a logic to identify
// a user. You might want to use "OpenID Connect".
// You can read more about the protocol in the following link:
// https://developers.google.com/accounts/docs/OAuth2Login.
var user = controller.Session["user"];
if (user == null)
{
user = Guid.NewGuid();
controller.Session["user"] = user;
}
return user.ToString();
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
}
代码被盗自Web 应用程序 (ASP.NET MVC) https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-aspnet-mvc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)