首页 > 解决方案 > .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 ***
    ...
});

标签: c#asp.net-mvcasp.net-coreasp.net-identity

解决方案


我们有类似的问题,我们的身份提供者应该能够使用不同的 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 帐户


推荐阅读