我有一个基于Web的应用程序。此应用程序允许用户按照Startup.cs中的此代码使用Google Auth进行登录/登录。
services.AddAuthentication().AddGoogle(googleOptions =>
{
googleOptions.ClientId = Configuration["ClientId"];
googleOptions.ClientSecret = Configuration["CliSecret"];
...
});
这一切都可以与现成的Identity系统很好地配合,因此我可以注册用户。
但是,我还希望用户在网站的单独区域进行注册后,能够使用单独的帐户“连接”其他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 ***
...
});
答案 0 :(得分:0)
我们遇到了类似的问题,我们的身份提供商应该能够使用不同的 Google 帐户登录不同客户的用户
我们决定按照您的建议添加多个 Google 区域。这里的要点是每个区域(定义了一些谷歌帐户)使用唯一的 cookie 方案。
当我们创建登录 URL 时,我们会获得该客户端所需的 google 帐户,获取它的 cookie 方案并为 Google 身份验证按钮创建正确的 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 中注册的服务的容器,以便从 DB 中获取具有不同 cookie 模式的 Google 帐户