【问题标题】:Possible Multiple AuthenticationSchemes in request header?请求标头中可能有多个 AuthenticationSchemes?
【发布时间】:2021-11-14 01:27:04
【问题描述】:

我有两个 webapi A 和 B。我从 A 向 B 发出请求。A 包含来自 identityserver4 的用户信息,我只需将令牌传递给请求标头。除了身份服务器令牌之外,A 还使用我注册 B 的 AAD(Azure Active Directory)。因此,我还从 A 中检查了我的 AAD,以便我可以从 Azure 检索令牌以发送给 B,这正是 B 可以信任的请求来自受信任的注册来源。正如您所了解的,从 A 我有两个令牌,一个用于检查登录用户,另一个用于检查已注册的应用程序。我的 A 启动类如下所示:

public void ConfigureServices(IServiceCollection services)
        {
            Config = services.ConfigureAuthConfig<AuthConfig>(Configuration.GetSection("AuthConfig"));
            services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddScoped<ICurrentUser, CurrentUser>();
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
          
           .AddIdentityServerAuthentication(//this coming with identityserver token and user info
                idt =>
                {
                    idt.Authority = "https://gnoauth.se:5005";
                    idt.ApiName = "globalnetworkApi";
                    idt.SaveToken = true;
                    idt.RequireHttpsMetadata = true;
                }
            );

所以这是我的 A httpclienthelper,我在其中设置我的客户端标头发送到 B,因为我已经从身份服务器获得令牌和用户,所以我在这里做的另一件事是将 B 权限、客户端 ID 和秘密发送到用于检索第二个令牌的 AAD:

var context = new HttpContextAccessor().HttpContext;
var accessTokenFromIdentityserver = await 
                context.GetTokenAsync(OpenIdConnectParameterNames.AccessToken);
var tokenfromAAD = result.AccessToken;

defaultRequestHeaders.Authorization = new 
                AuthenticationHeaderValue("AAD_Authentication", tokenfromAAD);

从这里我实际上拥有了我需要的一切,包括令牌和所有声明。正如您在默认请求头中看到的那样,我只能发送一个令牌,但我想将两个令牌都发送给 B,我如何配置请求标头才能做到这一点?

所以这里是 B 启动

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer("AAD_Authentication", opt =>
            {
                opt.Audience = Configuration["AAD:ResourceId"];
                opt.Authority = $"{Configuration["AAD:InstanceId"]}{Configuration["AAD:TenantId"]}";
                opt.RequireHttpsMetadata = true;
            })
            .AddJwtBearer("IDS4_Authentication",
                idt =>
                {
                    idt.Authority = "https://gnoauth.se:5005";
                    idt.Audience = "globalnetworkApi";
                    idt.SaveToken = true;
                    idt.RequireHttpsMetadata = true;
                }
            );

            services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddAuthenticationSchemes("AAD_Authentication", "IDS4_Authentication")
                .Build();

但我还设置了一个策略,以便我需要从我的一些控制器中授权登录用户和应用程序注册,像这样

[Authorize(AuthenticationSchemes = "AAD_Authentication,IDS4_Authentication", Policy = "MyPolicy")]

我一直面临的大问题是如何从 A 发送两个令牌以及如何设置身份验证方案以便 B 实际上获得两个不记名身份验证方案

请帮忙

【问题讨论】:

    标签: c# authentication identityserver4 dotnet-httpclient bearer-token


    【解决方案1】:

    这是我第一次看到两种身份验证方案同时出现的东西。有两个 JWT Bearer 配置。通常我用 JWT 和 Cookie 看到它,但不是用两个 JWT。

    您可能会注意到,A 的身份验证方案与 A 调用 B 的身份验证方案不同。在您的情况下,尽管 A 作为 API,但实际上是客户端请求 B 上的授权。从这个角度来看,您无需通过 A 身份验证即可上 B。

    每次您希望 A 调用 B 上的端点时,您应该使用具有特定流程的 HttpClient 或 TokenClient。

    AddAuthentication 配置是为了保护 A,而不是为了在 B 上获得授权。

    其他不同的问题是您需要两个身份提供者 AAD 和 IDS。这应该使用类似于外部身份提供者的东西。

    也许我错了,或者我没听懂你的意思。但我希望我能澄清一下这个问题。

    P.D. Azure Functions Easy Auth 有类似“代理”身份提供者的东西。我认为这与外部身份提供者的想法相同。

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 2013-08-29
      • 2017-02-24
      • 2018-02-03
      • 2017-06-10
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多