如何使用 Azure Active Directory 设置 Ocelot Api 网关

Posted

技术标签:

【中文标题】如何使用 Azure Active Directory 设置 Ocelot Api 网关【英文标题】:How set up Ocelot Api Gateway with Azure Active Directory 【发布时间】:2019-09-24 01:30:33 【问题描述】:

我遵循 this 教程并设法将 api 与 Azure Active Directory 一起使用 身份验证和授权。

但是,我想从 Ocelot Api 网关后面使用 api。 我可以使用带有自定义基本授权的 ocelot,但无法与 Azure Active Directory 一起使用。

我已经将 Ocelot api 网关 url 添加到我的 api 重定向 url 列表中。

我应该如何在 config.json 和 Ocelot Api Gateway 项目 StartUp.cs 中设置 ReRoutes 值?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

最终我可以。 首先感谢 ocelot 库,因为它支持 Azure Active Directory 授权。

我假设您已经可以完成this 教程。

1-像往常一样创建一个ocelot api网关项目。

2-将Microsoft.Identity.Web类库添加到ocelot项目中作为参考

3-添加ocelot.json,应该如下图

    
  "ReRoutes": [

    
      "DownstreamPathTemplate": "/api/catchAll",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        
          "Host": "localhost",
          "Port": 44351
        
      ],
      "UpstreamPathTemplate": "/to-do-service/api/catchAll",

      "AuthenticationOptions": 
        "AuthenticationProviderKey": "AzureADJwtBearer",
        "AllowedScopes": []
      
    

  ],
  "GlobalConfiguration": 
    "BaseUrl": "http://localhost:7070",
    "RequestIdKey": "OcRequestId",
    "AdministrationPath": "/administration"
  
    

4-编辑 Program.cs 中的 CreateWebHostBuilder 方法,以便将 ocelot.json 用作附加配置源。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
             .ConfigureAppConfiguration((hostingContext, config) =>
             
                 config.AddJsonFile("ocelot.json", false, false);
             )
                .UseStartup<Startup>();

5-在 Startup.cs 中编辑 ConfigureServices 和 Configure 方法,如下所示

public void ConfigureServices(IServiceCollection services)
        
            services.AddProtectWebApiWithMicrosoftIdentityPlatformV2(Configuration); //this extension comes from Microsoft.Identity.Web class library

            services.AddOcelot(Configuration);
            //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public async void Configure(IApplicationBuilder app, IHostingEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            await app.UseOcelot();
        

6-最后但同样重要的是,您应该将您的 AzureAd 配置添加到 ocelot api 网关项目。 (参考教程应该和 ToDoListService 一样) 她你可以看到一个示例 appsettings.json 。


  "AzureAd": 
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "client-id-guid-from-azure-ad",

    /*
      You need specify the TenantId only if you want to accept access tokens from a single tenant (line of business app)
      Otherwise you can leave them set to common
    */
    "Domain": "blablabla.onmicrosoft.com", // for instance contoso.onmicrosoft.com. Not used in the ASP.NET core template
    "TenantId": "tenant-id-guid-from-azure-ad" // A guid (Tenant ID = Directory ID) or 'common' or 'organizations' or 'consumers'
  ,
  "Logging": 
    "LogLevel": 
      "Default": "Warning"
    
  ,
  "AllowedHosts": "*"


我希望这个答案可以节省一些人的时间,让他们的生活更快乐:)

编码愉快!

【讨论】:

此解决方案不适用于 .net core 3.1。请问您对此有任何更新的解决方案吗 很抱歉我们放弃了使用 AAD,我不需要将我的解决方案升级到核心 3.1 版本。【参考方案2】:

我无法使用“Microsoft.Identity.Web”库进行此操作。我收到了许多错误,例如:

AuthenticationScheme:AzureADCookie 未通过身份验证...

-- 和--

签名验证失败...

相反,我设法获得了 Azure B2C 令牌验证以及范围,工作如下:

1)ConfigureServices方法(Startup.cs):

    services.AddAuthentication(options =>
            
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 
             )
           .AddJwtBearer(jwtOptions =>
           
               jwtOptions.Authority = $"Configuration["AzureAdB2C:Instance"]/tfp/Configuration["AzureAdB2C:TenantId"]/Configuration["AzureAdB2C:SignUpSignInPolicyId"]";
               jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
               jwtOptions.TokenValidationParameters.ValidateIssuer = true; 
               jwtOptions.TokenValidationParameters.ValidIssuer = $"Configuration["AzureAdB2C:Instance"]/Configuration["AzureAdB2C:TenantId"]/v2.0/"; 
           ); 

            // Map scp to scope claims instead of http://schemas.microsoft.com/identity/claims/scope to allow ocelot to read/verify them
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("scp");
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Add("scp", "scope");


2) Ocelot re-routing configuration:

     
      "DownstreamPathTemplate": "/everything",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        
          "Host": "master-api",
          "Port": 5000
        
      ],
      "UpstreamPathTemplate": "/master-api/everything",
      "UpstreamHttpMethod": [ "POST", "PUT", "GET", "DELETE" ],
      "ReRoutesCaseSensitive": false,
      "AuthenticationOptions": 
        "AuthenticationProviderKey": "Bearer",
        "AllowedScopes": [ "master" ]
      
    

3) Azure AD B2C 配置(appsettings.json):

  "AzureAdB2C": 
    "Instance": "https://yourdomain.b2clogin.com",
    "TenantId": "tenantId",
    "SignUpSignInPolicyId": "your_signin_policy",
    "ClientId": "clientId"
  

希望这会有所帮助! :)

【讨论】:

以上是关于如何使用 Azure Active Directory 设置 Ocelot Api 网关的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure Active Directory 设置 Ocelot Api 网关

Blazor 应用如何使用 Azure Active Directory 认证登录

Azure Active Directory 如何支持将 Okta 作为 IDP 进行联合?

我如何获得Azure Active Directory B2c登录用户角色?

如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?

如何在 Azure Active Directory 中制作 Native Client Application 单租户?