【问题标题】:Multiple Google Authentication scopes in .NET Core depending on controller.NET Core 中的多个 Google 身份验证范围取决于控制器
【发布时间】:2019-04-28 00:20:27
【问题描述】:

我有一个基于网络的应用程序。此应用程序允许用户按照 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 ***
    ...
});

【问题讨论】:

  • 您将需要多个客户端 ID,就像您建议的那样。
  • 啊 - 所以我不能使用相同的客户端 ID 并根据情况调整范围配置?另外,如果我在 Google Auth 中使用不同的客户端 ID,我该如何选择我想要的?
  • 您指定连接时要使用的clientId。
  • 为应用程序授予范围。要请求额外的范围,用户必须重新授权应用程序。重点在于,您的应用应该提前了解它可能使用的范围,即使它们并不适用于每个用户或所有情况。
  • 干杯克里斯。我实际上已经走这条路了。该应用程序请求相同的东西,我只是在 2 个地方管理范围的不同用途。

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


【解决方案1】:

我们有类似的问题,我们的身份提供者应该能够使用不同的 Google 帐户登录不同客户端的用户

我们决定按照您的建议添加多个 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 帐户

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2019-03-14
    • 2020-09-01
    • 2013-09-24
    • 2018-08-12
    • 2016-05-31
    • 2018-12-17
    相关资源
    最近更新 更多