OID C Клиент, поддерживающий несколько поставщиков OID C. Поставщики возвращают данные претензий, но не аутентифицированы на клиенте, и претензия пуста - PullRequest
0 голосов
/ 24 марта 2020

         options.ClientId = myOptions.ClientId;
         options.ClientSecret = myOptions.ClientSecret;
         options.Authority = myOptions.Domain;
         options.CallbackPath = new PathString(myOptions.CallbackPath ?? options.CallbackPath); 
         options.SignedOutCallbackPath = myOptions.SignedOutCallbackPath ?? options.SignedOutCallbackPath;
         options.ResponseType = myOptions.ResponseType; 
         options.SignInScheme = myOptions.CookieSchemeName;
         var keyAsBytes = Encoding.UTF8.GetBytes(myOptions.ClientSecret);
         var issuerSigningKey = new SymmetricSecurityKey(keyAsBytes);

         // Set the correct name claim type
         options.TokenValidationParameters = new TokenValidationParameters
         {
             NameClaimType = "name",
             IssuerSigningKey = issuerSigningKey
         };

и OnTicketReceived возвращает информацию о претензиях.

           OnTicketReceived = context =>
             {
                  var user = context.Principal;
                  var httpContext = context.HttpContext;
                  return Task.FromResult(0);
              },

Но в HomeController.cs. User.Identity.IsAuthenticated возвращает false, а User.Identity.claims.count () равно 0.

 public IActionResult Index()
        {
            if (User.Identity.IsAuthenticated)
            {
               //authenticated 

            }else{            
               //not authenticated
            }

Но приведенный выше случай имеет место только тогда, когда у меня настроено несколько провайдеров. Нравится. В противном случае, если один поставщик, он работает как шарм. Только несколько провайдеров. Я сделал разные URI перенаправления и схемы cook ie и openid разные для каждого провайдера. Чего мне не хватает?

      public void ConfigureServices(IServiceCollection services)
      {
            services.AddSingleton<IConfiguration>(Configuration);
           // services.AddAntiforgery();
            services.AddDataProtection();
            services.AddSession(options =>
            {
                // Set a short timeout for easy testing.
                options.IdleTimeout = TimeSpan.FromSeconds(180);
                options.Cookie.HttpOnly = true;
                // Make the session cookie essential
                options.Cookie.SameSite = SameSiteMode.Lax;
                options.Cookie.IsEssential = true;
                options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
            });
         //azure ad - if this one is defined alone it works but when added the one below it doesn't 
          //signin in to the cookie or the client. But the IDP signs in and returns claim
             services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
               .AddAzureAD(options => Configuration.GetSection(Providers.AzureAD).Bind(options));
//corporate AD - if specified alone without Azure AD works. But if both defined it fails.
             services.AddAuthentication(CorporateADDefaults.AuthenticationScheme)
               .AddCorporateAD(options => Configuration.GetSection(Providers.CorporateAD).Bind(options));

            services.AddAuthorization(o => o.AddPolicy("Denied", new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .RequireAssertion(ahc => false)
                .Build()));

            services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
            {
                builder.AllowAnyOrigin()
                       .AllowAnyMethod()
                       .AllowAnyHeader();
            })  );
            services.AddMvc(options => options.EnableEndpointRouting = false)
                .SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddRazorPagesOptions(o => 
                     o.Conventions.AuthorizePage("/About", "Denied"))
       }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            // app.UseStaticFiles();
            // app.UseCookiePolicy();

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

            app.UseCors("MyPolicy");
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseSession();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapRazorPages();
            });
        }

В Appsettings - конфигурация настроена так:

  "AzureAD": {
   "ClientId": "*******************",
     "Domain": "mydomain.onmicrosoft.com",
   "Instance": "https://login.microsoftonline.com/",
   "TenantId": "*********************",
    "CallbackPath": "/signin-azuread",
     "ClientSecret": "*******************",

  },

  "CorporateAD": {
   "ClientId": "*******************",
   "Domain": "mydomain.CorporateADDomain.com",
    "CallbackPath": "/signin-oidc",
   "ClientSecret": "*******************",

  }

У меня разные обработчики для каждого типа. Но код упоминается сверху.

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

...