.NET Core中的多个Google身份验证范围取决于控制器

时间:2018-11-26 11:00:18

标签: c# asp.net-mvc asp.net-core asp.net-identity

我有一个基于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 ***
    ...
});

1 个答案:

答案 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 帐户