Asp.net mvc 如何防止ASP NET MVC应用程序每小时向Google请求授权?
我们在ASP.NETMVC应用程序中使用的是Asp.net mvc 如何防止ASP NET MVC应用程序每小时向Google请求授权?,asp.net-mvc,google-api-dotnet-client,Asp.net Mvc,Google Api Dotnet Client,我们在ASP.NETMVC应用程序中使用的是Google.api.Calendar.v3和Google.api.Auth.Mvc 我们希望每个用户都能访问他们的谷歌日历,所以有必要让每个用户都对我们的应用程序授予权限。我们已经读了很多,据说有一种方法可以防止应用程序每小时向用户请求这些凭据 我们已经考虑过这样的解决方案,但不适用于我们 像我们这样的解决方案不知道如何在MVC应用程序中使用它们 用户可以使用谷歌在我们的网站上注册,也可以不注册 这是我们尝试的最后一个代码,所有操作都正常,除了已经授
Google.api.Calendar.v3
和Google.api.Auth.Mvc
我们希望每个用户都能访问他们的谷歌日历,所以有必要让每个用户都对我们的应用程序授予权限。我们已经读了很多,据说有一种方法可以防止应用程序每小时向用户请求这些凭据
我们已经考虑过这样的解决方案,但不适用于我们
像我们这样的解决方案不知道如何在MVC应用程序中使用它们
用户可以使用谷歌在我们的网站上注册,也可以不注册
这是我们尝试的最后一个代码,所有操作都正常,除了已经授予我们的应用程序权限的用户每小时都必须重新执行一次,并向google重新验证并授予权限:
流元数据实现
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new ForceOfflineGoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "MY_VALID_CLIENT_ID",
ClientSecret = "MY_VALID_CLIENT_SECRET"
},
Scopes = new[] { CalendarService.Scope.Calendar },
DataStore = new FileDataStore("Google.Api.Auth.Store")
});
public override string GetUserId(Controller controller)
{
var userId = controller.User.Identity.GetUserId();
return userId;
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
public async Task IndexAsync(CancellationToken cancellationToken)
{
var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
AuthorizeAsync(cancellationToken);
if (result.Credential != null)
{
var service = new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = result.Credential,
ApplicationName = "TEST",
});
IList list = service.CalendarList.List().Execute().Items;
var selected = list.First();
EventsResource.ListRequest request = service.Events.List(selected.Id);
request.TimeMin = new DateTime?(new DateTime(2017, 1, 1));
request.ShowDeleted = false;
request.SingleEvents = true;
request.MaxResults = 10;
request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;
Events events = request.Execute();
return View(events);
}
else
{
return new RedirectResult(result.RedirectUri);
}
}
公共类AppFlowMetadata:FlowMetadata
{
私有静态只读IAuthorizationCodeFlow流=
新的ForceOfflineGoogleAuthorizationCodeFlow(新的GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets=新的ClientSecrets
{
ClientId=“我的有效客户ID”,
ClientSecret=“我的\u有效\u客户\u密码”
},
Scopes=new[]{CalendarService.Scope.Calendar},
DataStore=newfiledatastore(“Google.Api.Auth.Store”)
});
公共重写字符串GetUserId(控制器)
{
var userId=controller.User.Identity.GetUserId();
返回用户标识;
}
公共覆盖IAuthorizationCodeFlow流
{
获取{返回流;}
}
}
GoogleAuthorizationCodeFlow实施强制离线
internal class ForceOfflineGoogleAuthorizationCodeFlow : GoogleAuthorizationCodeFlow
{
public ForceOfflineGoogleAuthorizationCodeFlow(GoogleAuthorizationCodeFlow.Initializer initializer) : base(initializer) { }
public override AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(string redirectUri)
{
return new GoogleAuthorizationCodeRequestUrl(new Uri(AuthorizationServerUrl))
{
ClientId = ClientSecrets.ClientId,
Scope = string.Join(" ", Scopes),
RedirectUri = redirectUri,
AccessType = "offline",
ApprovalPrompt = "force"
};
}
}
内部类ForceOfflineGoogleAuthorizationCodeFlow:GoogleAuthorizationCodeFlow
{
public ForceOfflineGoogleAuthorizationCodeFlow(GoogleAuthorizationCodeFlow.Initializer初始值设定项):基(初始值设定项){}
公共覆盖AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(字符串重定向URI)
{
返回新的GoogleAuthorizationCodeRequestUrl(新Uri(AuthorizationServerUrl))
{
ClientId=ClientSecrets.ClientId,
Scope=string.Join(“,Scopes),
RedirectUri=RedirectUri,
AccessType=“离线”,
ApprovalPrompt=“强制”
};
}
}
AuthCallbackController
public class AuthCallbackController : Google.Apis.Auth.OAuth2.Mvc.Controllers.AuthCallbackController
{
protected override Google.Apis.Auth.OAuth2.Mvc.FlowMetadata FlowData
{
get { return new AppFlowMetadata(); }
}
}
公共类AuthCallbackController:Google.api.Auth.OAuth2.Mvc.Controllers.AuthCallbackController
{
受保护的覆盖Google.API.Auth.OAuth2.Mvc.FlowMetadata FlowData
{
获取{返回新的AppFlowMetadata();}
}
}
测试控制器动作
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new ForceOfflineGoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "MY_VALID_CLIENT_ID",
ClientSecret = "MY_VALID_CLIENT_SECRET"
},
Scopes = new[] { CalendarService.Scope.Calendar },
DataStore = new FileDataStore("Google.Api.Auth.Store")
});
public override string GetUserId(Controller controller)
{
var userId = controller.User.Identity.GetUserId();
return userId;
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
public async Task IndexAsync(CancellationToken cancellationToken)
{
var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
AuthorizeAsync(cancellationToken);
if (result.Credential != null)
{
var service = new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = result.Credential,
ApplicationName = "TEST",
});
IList list = service.CalendarList.List().Execute().Items;
var selected = list.First();
EventsResource.ListRequest request = service.Events.List(selected.Id);
request.TimeMin = new DateTime?(new DateTime(2017, 1, 1));
request.ShowDeleted = false;
request.SingleEvents = true;
request.MaxResults = 10;
request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;
Events events = request.Execute();
return View(events);
}
else
{
return new RedirectResult(result.RedirectUri);
}
}
公共异步任务索引同步(CancellationToken CancellationToken)
{
var result=wait new AuthorizationCodeMvcApp(这是新的AppFlowMetadata())。
AuthorizeAsync(取消令牌);
如果(result.Credential!=null)
{
var service=new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer=result.Credential,
ApplicationName=“测试”,
});
IList list=service.CalendarList.list().Execute().Items;
var selected=list.First();
EventsResource.ListRequest请求=service.Events.List(selected.Id);
request.TimeMin=new DateTime?(new DateTime(2017,1,1));
request.showdeled=false;
request.SingleEvents=true;
request.MaxResults=10;
request.OrderBy=EventsResource.ListRequest.OrderByEnum.StartTime;
Events=request.Execute();
返回视图(事件);
}
其他的
{
返回新的重定向结果(result.RedirectUri);
}
}