c# - .NET Core 中的多个 Google 身份验证范围取决于控制器
问题描述
我有一个基于网络的应用程序。此应用程序允许用户按照 Startup.cs 中的此代码使用 Google Auth 注册/登录
services.AddAuthentication().AddGoogle(googleOptions =>
{
googleOptions.ClientId = Configuration["ClientId"];
googleOptions.ClientSecret = Configuration["CliSecret"];
...
});
这一切都可以很好地与开箱即用的身份系统配合使用,因此我可以注册用户。
但是,我还希望用户在网站的单独区域注册后能够使用单独的帐户“连接”到其他 Google 服务。
例如,我可能希望用户关联他们的 AdWords 帐户。他们将通过非身份流向 Google 进行身份验证,相关信息(令牌、刷新令牌等)将独立存储在数据库中(即它不会在AspNetUSers
表中存储“用户”)。
我可以在初次调用 google 之前更改控制器中的身份验证范围吗?
在这种情况下使用相同的身份验证服务但有一些额外的范围会很好。那可能吗?
或者,在 Startup.cs 中有另一个Google 部分...可能像:
services.AddAuthentication().AddGoogle(googleOptions =>
{
googleOptions.ClientId = Configuration["ClientId"];
googleOptions.ClientSecret = Configuration["CliSecret"];
googleOptions.Scope.Add("https://www.googleapis.com/auth/adwords"); //*** THIS IS THE EXTRA SCOPE NEEDED ***
...
});
解决方案
我们有类似的问题,我们的身份提供者应该能够使用不同的 Google 帐户登录不同客户的用户
我们决定按照您的建议添加多个 Google 区域。这里的要点是每个区域(定义了一些谷歌帐户)都使用独特的 cookie 方案。
当我们创建登录 URL 时,我们获取该客户端所需的 google 帐户,获取它的 cookie 方案并为 Google Authenticate 按钮创建正确的 URL
代码示例:
public static class AuthenticationBuilderGoogleAdder
{
public static AuthenticationBuilder AddGoogleAuth(this AuthenticationBuilder authenticationBuilder, IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
// create IThirdPartyProvidersProvider realization with GetByProviderCode method
var authThirdPartyProvidersProvider = serviceProvider.GetService<IThirdPartyProvidersProvider>();
var googleProviders = authThirdPartyProvidersProvider.GetByProviderCode("google");
googleProviders.ForEach(p =>
{
authenticationBuilder = authenticationBuilder.AddGoogle(p.CookieScheme, options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = p.ClientId;
options.ClientSecret = p.ClientSecret;
});
});
return authenticationBuilder;
}
}
将其注册为
services.AddAuthentication()
.AddGoogleAuth(services)
我们调用 services.BuildServiceProvider() 来创建另一个容器,其中包含已经在 DI 中注册的服务,以便从数据库中获取具有不同 cookie 架构的 Google 帐户
推荐阅读
- java - WebFilter:如何使用西里尔字符指定 urlPattern?
- c# - 如何修复从右到左的绘制矩形
- angular - 如何在 Angular 4 的下拉菜单中正确绑定枚举?
- angular - 我可以在 get 方法中更改 Date 类型的属性吗?
- nativescript - 如何在 nativescript 中使用本地插件和云构建?
- sql - 使用链接表oracle匹配多行时如何以嵌套格式显示行
- javascript - 在 Wordpress 中从 JavaScript 更新帖子
- java - hibernate:如何在不检索所有尚未检索的字段的情况下取消代理实体类?
- powershell - PowerShell 运算符,在第一个句点之前选择
- c# - C# Streaming screen over Network