ASP.NET Core MVC с Azure OAuth за входом переходит в бесконечный цикл входа в систему - PullRequest
0 голосов
/ 12 октября 2019

Использование простого ASP.NET Core MVC с шаблоном:

Из cli:

dotnet new mvc --auth SingleOrg --client-id ***** --tenant-id 3**** --domain ***.onmicrosoft.com 

Это создает и создает шаблон, все отлично работает на localhost.

При создании и настройке за входом, я получаю бесконечный цикл при попытке входа в систему.

Это мой вход yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  creationTimestamp: "2019-09-11T14:06:56Z"
  generation: 3
  name: secured-ingress
  namespace: default
  resourceVersion: "5022818"
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/secured-ingress
  uid: 69d948fa-d49d-11e9-ac98-3ab4552521b0
spec:
  rules:
  - host: authpr.westeurope.cloudapp.azure.com
    http:
      paths:
      - backend:
          serviceName: newad
          servicePort: 80
        path: /(.*)
  tls:
  - hosts:
    - authpr.westeurope.cloudapp.azure.com
    secretName: aks-authpr
status:
  loadBalancer:
    ingress:
    - {}

При нажатии на URL выше негоперенаправляет меня в Azure AD, затем он бесконечно возвращается к входу в систему.

Чего-то не хватает в коде?

Я прочитал много статей, кажется, что есть много проблемс этим.

Я попытался реализовать: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.0&viewFallbackFrom=aspnetcore-2.0

Много играл с файлом startup.cs, но всегда получал одно и то же поведение.

Бесконечный цикл.

Когда я просматриваю журналы отладки, я всегда вижу:

dbug: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Execution plan of result filters (in the following order): Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.SaveTempDataFilter
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed.

Вот мой текущий startup.cs файл:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options => Configuration.Bind("AzureAd", options));

services.AddMvc(options =>
                {
                    var policy = new AuthorizationPolicyBuilder()
                                        .RequireAuthenticatedUser()
                                        .Build();
                    options.Filters.Add(new AuthorizeFilter(policy));
                })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

if (string.Equals(Environment.GetEnvironmentVariable("ASPNETCORE_FORWARDEDHEADERS_ENABLED"), "true", StringComparison.OrdinalIgnoreCase))
{
    services.Configure<ForwardedHeadersOptions>(options =>
             {
                 options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | 
                                            ForwardedHeaders.XForwardedProto;
                 // Only loopback proxies are allowed by default.
                 // Clear that restriction because forwarders are enabled by  
                 // explicit configuration.
                 options.KnownNetworks.Clear();
                 options.KnownProxies.Clear();
             });
    }
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        // app.UseHsts();
    }

    app.Use((context, next) =>
        {
            context.Request.Scheme = "https";
            return next();
        });

    app.UseForwardedHeaders();
    // app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseAuthentication();

    // app.Use(async (context, next) =>
    //         {
    //              if (context.Request.IsHttps || context.Request.Headers["X-Forwarded-Proto"] == Uri.UriSchemeHttps)
    //              {
    //                   await next();
    //              }
    //              else
    //              {
    //                   string queryString = context.Request.QueryString.HasValue ? context.Request.QueryString.Value : string.Empty;
    //                   var https = "https://" + context.Request.Host + context.Request.Path + queryString;
    //                   context.Response.Redirect(https);
    //              }
    //          });

app.UseMvc(routes =>
           {
                routes.MapRoute(name: "default",
                                template: "{controller=Home}/{action=Index}/{id?}");
           });
}

Ожидаемое поведение должно быть в состояниидля доступа к URL-адресу после успешной аутентификации, может быть, что отсутствует какой-либо конфиг в файле startup.csе

1 Ответ

1 голос
/ 14 октября 2019

мне удалось решить проблему с помощью: https://github.com/kubernetes/ingress-nginx/issues/4675

первый вход yaml должен выглядеть следующим образом:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  creationTimestamp: 2019-09-11T14:06:56Z
  generation: 4
  name: secured-ingress
  namespace: default
  resourceVersion: "5177035"
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/secured-ingress
  uid: 69d948fa-d49d-11e9-ac98-3ab4552521b0
spec:
  rules:
  - host: authpr.westeurope.cloudapp.azure.com
    http:
      paths:
      - backend:
          serviceName: newad
          servicePort: 80
        path: /
  tls:
  - hosts:
    - authpr.westeurope.cloudapp.azure.com
    secretName: aks-authpr
status:
  loadBalancer:
    ingress:
    - {}

, затем в файле startup.cs вам нужно установитьследующее поверх того, что генерируется:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                //Outside dev, require HTTPS and use HSTS
                app.UseHttpsRedirection();
                app.UseHsts();
            }

            app.UseStaticFiles();
             app.Use((context, next) =>
        {
            context.Request.Scheme = "https";
            return next();
        });

            app.UseForwardedHeaders();
            app.UseAuthentication();

            app.UseMvcWithDefaultRoute();
        }
...