【问题标题】:How set up Ocelot Api Gateway with Azure Active Directory如何使用 Azure Active Directory 设置 Ocelot Api 网关
【发布时间】: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 值?

任何帮助将不胜感激。

【问题讨论】:

    标签: azure asp.net-core azure-active-directory asp.net-core-webapi ocelot


    【解决方案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}"
      }
    

    希望这会有所帮助! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多