C# .NET核心中的多个Google身份验证作用域取决于控制器

C# .NET核心中的多个Google身份验证作用域取决于控制器,c#,asp.net-mvc,asp.net-core,asp.net-identity,C#,Asp.net Mvc,Asp.net Core,Asp.net Identity,我有一个基于网络的应用程序。此应用程序允许用户根据Startup.cs中的此代码使用Google Auth注册/登录 services.AddAuthentication().AddGoogle(googleOptions => { googleOptions.ClientId = Configuration["ClientId"]; googleOptions.ClientSecret = Configuration["CliSecret"]; ... });

我有一个基于网络的应用程序。此应用程序允许用户根据Startup.cs中的此代码使用Google Auth注册/登录

services.AddAuthentication().AddGoogle(googleOptions =>
{
    googleOptions.ClientId = Configuration["ClientId"];
    googleOptions.ClientSecret = Configuration["CliSecret"];
    ...
});
这一切都与开箱即用的身份系统配合得很好,所以我可以注册用户

然而,我也希望用户能够在注册后在网站的一个单独区域通过单独的帐户“连接”到其他谷歌服务

例如,我可能希望用户连接他们的AdWords帐户。 他们将通过非身份流向谷歌进行身份验证,相关信息(令牌、刷新令牌等)将独立存储在数据库中(即不会在
AspNetUSers
表中存储“用户”)

在我首次呼叫谷歌之前,我可以更改控制器中的身份验证范围吗?

最好使用相同的身份验证服务,但在本例中有一些额外的作用域。可能吗

或者,在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.BuildServiceProvider()来创建另一个容器,其中包含已在DI中注册的服务,以便从DB中获取具有不同cookie模式的Google帐户,就像你建议的那样。啊-所以我不能使用相同的客户端ID,并根据情况调整范围配置?另外,如果我在Google Auth中使用不同的客户端id-如何选择所需的客户端id?请指定连接时要使用的客户端id。将为应用程序授予作用域。要请求其他作用域,用户必须重新授权应用程序。关键是,你的应用程序应该提前知道它可能使用的范围,即使它们不适用于每一个用户或每种情况。克里斯,干杯。我实际上走了这条路。该应用程序要求所有相同的东西,我只是在两个地方管理范围的不同用途。
services.AddAuthentication()
            .AddGoogleAuth(services)