Sökresultat :

×

Konfigurera SAML Single Sign-On (SSO) i ASP.NET Core Decoupled Application

Den här guiden innehåller detaljerade steg för att konfigurera SAML Single Sign-On (SSO) i en ASP.NET Core-applikation med frikopplad arkitektur med valfri SAML-kompatibel identitetsleverantör (IdP). Backend-systemet (ASP.NET Core) hanterar SSO-autentisering, genererar en JWT-token och exponerar den säkert för valfritt frontend-system (React, Angular, Vue, etc.).

Plattformssupport: ASP.NET Core SAML-mellanprogramvaran stöder ASP.NET Core 2.0 och senare. Den stöder alla ASP.NET Core-plattformar, inklusive Windows, Linux och macOS.

NuGet-paketet
.NET CLI

PM> NuGet\Install-Package miniOrange.SAML.SSO


Obs: För att integrera miniOrange ASP.NET SAML SSO-mellanvaran i din applikation, måste du lägga till nedanstående namnområden, tjänster och mellanprogram i ditt projekt, nedan är ett exempel på implementering som referens.

  using miniOrange.saml;
  using System.Reflection;
  var builder=WebApplication.CreateBuilder(args);
  // Add services to the container.
  builder.Services.AddRazorPages();
  builder.Services.AddAuthentication(options =>
  {
    options.DefaultAuthenticationScheme ="SS0_OR_Admin";
    options.DefaultScheme = "SSO_OR_Admin";
    options.DefaultChallengeScheme = "SSO_OR_Admin";
  })
  .AddCookie("moAdmin", options =>
  {
    
  })
  .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
  {
    
  })
  .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
  {
    options.TokenValidationParameters = new TokenValidationParameters
    {
      ValidateIssuer = true,
      ValidateAudience = true,
      ValidateLifetime = true,
      ValidateIssuerSigningKey = true,
      ValidIssuer = "your-issuer",
      ValidAudience = "your-audience",
      IssuerSigningKey = new
  SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
    };
  })
  .AddPolicyScheme("SSO_OR_Admin", "SSO_OR_Admin", options =>
  {
    options.ForwardDefaultSelector = context =>
    {
      // Check if Bearer token exists
      string authHeader = context.Request.Headers["Authorization"].FirstOrDefault() ?? "";
      if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Bearer"))
      {
        return JwtBearerDefaults.AuthenticationScheme;
      }
      foreach (var cookie in context.Request.Cookies)
      {
         if (cookie.Key.Contains(".AspNetCore.Cookies") &&
        context.Request.Query["ssoaction"] != "config")
        {
          return CookieAuthenticationDefaults.AuthenticationScheme;
        }
    }
    return "moAdmin";
    };
  });
  var app = builder.Build();
  if(!app.Environment.IsDevelopment())
  {
    app.UseExceptionHandler("/Error");
    app.UseHsts();
  }
  app.UseHttpsRedirection();
  app.UseRouting();
  app.UseAuthorization();
  app.MapRazorPages();
  app.UseCookiePolicy();
  app.UseAuthentication();
  app.UseStaticFiles();
  app.UseminiOrangeSAMLSSOMiddleware();
  app.Run();
NuGet-paketet
.NET CLI

PM> NuGet\Install-Package miniOrange.SAML.SSO


Obs: För att integrera miniOrange ASP.NET SAML SSO-mellanvaran i din applikation måste du lägga till nedanstående namnområden, tjänster och mellanprogram i ditt projekt, nedan är ett exempel.

  using miniOrange.saml;
  using System.Reflection;
  public class Startup
  {
   public Startup(IConfiguration configuration)
   {
    Configuration = configuration;
   }
   public IConfiguration Configuration {get;}
   // This method gets called by the runtime. Use this method to add services to the container.
   public void ConfigureServices(IServiceCollection services)
   {
    services.AddRazorPages();
  services.AddAuthentication(options =>
  {
    options.DefaultAuthenticationScheme ="SS0_OR_Admin";
    options.DefaultScheme = "SSO_OR_Admin";
    options.DefaultChallengeScheme = "SSO_OR_Admin";
  })
  .AddCookie("moAdmin", options =>
  {
    
  })
  .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
  {
    
  })
  .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
  {
    options.TokenValidationParameters = new TokenValidationParameters
    {
      ValidateIssuer = true,
      ValidateAudience = true,
      ValidateLifetime = true,
      ValidateIssuerSigningKey = true,
      ValidIssuer = "your-issuer",
      ValidAudience = "your-audience",
      IssuerSigningKey = new
  SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
    };
  })
  .AddPolicyScheme("SSO_OR_Admin", "SSO_OR_Admin", options =>
  {
    options.ForwardDefaultSelector = context =>
    {
      // Check if Bearer token exists
      string authHeader = context.Request.Headers["Authorization"].FirstOrDefault() ?? "";
      if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Bearer"))
      {
        return JwtBearerDefaults.AuthenticationScheme;
      }
      foreach (var cookie in context.Request.Cookies)
      {
         if (cookie.Key.Contains(".AspNetCore.Cookies") &&
        context.Request.Query["ssoaction"] != "config")
        {
          return CookieAuthenticationDefaults.AuthenticationScheme;
        }
    }
    return "moAdmin";
    };
  });
   }
   // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   {
    if (env.IsDevelopment())
    {
     app.UseDeveloperExceptionPage();
    }
   else
    {
     app.UseExceptionHandler("/Error");
    app.UseHsts();
    }
   app.UseHttpsRedirection();
   app.UseCookiePolicy();
   app.UseAuthentication();
   app.UseStaticFiles();
   app.UseminiOrangeSAMLSSOMiddleware();
   app.UseRouting();
   app.UseAuthorization();
   app.UseEndpoints(endpoints =>
   {
    endpoints.MapRazorPages();
   });
  }
 }

Om du får CORS-problem Lägg till tjänsten och policyn nedan när du gör API-anrop.

builder.Services.AddCors(options =>
{
  options.AddPolicy("<policy-name>",policy =>
  {
    policy.WithOrigins("<your-origin>",policy)
      .AllowAnyHeader()
      .AllowAnyMethod()
      .AllowCredentials()
  });
});
//Add this in the middleware section
app.UseCors("<policy-name>");

Steg-för-steg-guide för ASP.NET Core SAML SSO med din identitetsleverantör.


  • Efter integreringen öppnar du din webbläsare och bläddrar i anslutningspanelen med webbadressen nedan:
 http(s)<your-dotnet-application-base-url>?ssoaction=config
  • Om registreringssidan eller inloggningssidan dyker upp har du lagt till miniOrange SAML SSO-mellanprogramvaran i din applikation.
ASP.NET Core-registreringssida

  • Registrera dig eller logga in med ditt konto genom att klicka på Registrera för att konfigurera mellanvaran.
  • Enligt plugin Settings På fliken väljer du din identitetsleverantör från listan som visas.
ASP.NET Core SAML Single Sign-On (SSO) med miniOrange som IDP - Lägg till ny IDP

Det finns två sätt som beskrivs nedan med vilka du kan få SAML SP-metadata att konfigurera på din identitetsleverantör.

A] Använda SAML-metadata-URL eller metadatafil

  • I Menyn för plugininställningar, leta efter Inställningar för tjänsteleverantör. Under det kan du hitta metadata-URLen samt möjligheten att ladda ner SAML-metadata.
  • Kopiera metadata-URL eller ladda ned metadatafilen för att konfigurera densamma på din identitetsleverantör.
  • Du kan hänvisa till skärmdumpen nedan:
ASP.NET Core- Service Provider Metadata

B] Ladda upp metadata manuellt

  • Från Inställningar för tjänsteleverantör avsnitt, kan du manuellt kopiera tjänsteleverantörens metadata som SP Entity ID, ACS URL, Single Logout URL och dela den med din identitetsleverantör för konfiguration.
  • Du kan hänvisa till skärmdumpen nedan:
ASP.NET Core- mata in sp-data manuellt

Det finns två sätt som beskrivs nedan med vilka du kan konfigurera din SAML Identity Provider-metadata i mellanvaran.

A] Ladda upp metadata med knappen Ladda upp IDP-metadata:

  • Om din identitetsleverantör har försett dig med metadata-URL:en eller metadatafilen (endast .xml-format) kan du helt enkelt konfigurera identitetsleverantörens metadata i mellanprogramvaran med hjälp av Ladda upp IDP-metadata alternativ.
  • Kopiera metadata-URL eller ladda ned metadatafilen för att konfigurera densamma på din identitetsleverantör.
  • Du kan hänvisa till skärmdumpen nedan:
ASP.NET Core- Ladda upp IDP-metadata

  • Du kan välja vilket som helst av alternativen enligt det metadataformat du har tillgängligt.

B] Konfigurera identitetsleverantörens metadata manuellt:

  • Efter att ha konfigurerat din Identitetsleverantör, det kommer att förse dig med IDP Entity ID, IDP Single Sign On URL och SAML X509-certifikat fält respektive.
  • Klicka Spara för att spara dina IDP-uppgifter.
ASP.NET Core- Konfigurera IDP manuellt
  • Klicka på Testkonfiguration knappen för att testa om SAML-konfigurationen du har gjort är korrekt.
  • Skärmdumpen nedan visar ett lyckat resultat. Klicka på SSO-integration för att fortsätta med SSO-integrationen.
ASP.NET Core- Testkonfiguration

  • Om du upplever något fel i middleware-änden kommer du att visas med fönstret som liknar nedan.
ASP.NET Core- Testkonfigurationsfel

  • För att felsöka felet kan du följa stegen nedan:
  • Enligt felsöka fliken, aktivera växeln för att ta emot pluginloggarna.
ASP.NET Core- Felsökning

  • När det är aktiverat kan du hämta plugin-loggar genom att navigera till plugin Settings fliken och klicka på Testkonfiguration.
  • ladda ner loggfil från felsöka fliken för att se vad som gick fel.
  • Du kan dela loggfil med oss ​​kl aspnetsupport@xecurify.com och vårt team kommer att kontakta dig för att lösa ditt problem.

  • Efter att ha testat konfigurationen, mappa dina applikationsattribut med attributen Identity Provider (IdP).
  • Obs: Alla mappade attribut lagras i sessionen så att du kan komma åt dem i din applikation.
ASP.NET Core- Attribut Mapping


  • Dessa steg låter dig hämta SSO-användarinformationen i din ansökan i form av användaranspråk.
  • Obs: Denna testversion av mellanprogramvaran stöder endast användarinformation i anspråk, hämtning av användarinformation i sessioner och rubriker är tillgängligt i premium-pluginet.
  • Skapa en GET-slutpunkt på .NET-sidan för att returnera JWT-token efter inloggning.
    Obs: Om du har en metod för att skapa en JWT behöver du bara välja anspråken från .NET-cookien.
    Nedan följer koden för din referens:
  • [HttpGet("gettoken")]
    public string GetToken()
    {
      if(User.Identity!=null && User.Identity.IsAuthenticated)
      {
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes
        ("Your-JWT-secret-key"));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var identity = (ClaimsIdentity)User.Identity;
        var claims = identity.Claims;

        var token = new JwtSecurityToken(
          issuer:"<issuer-name>",
          audience:"<audience>",
          claims:claims,
          expires: DateTime.UtcNow.AddHours(1),
          signingCredentials: creds
          );
          return new JwtSecurityTokenHandler().WriteToken(token);
      }
      return null;
      }
  • Hök på Välj Åtgärder och klicka på Kopiera SSO-länk.
ASP.NET Core Copy SSO-länk

  • Använd följande URL som en länk i applikationen där du vill utföra SSO:
  • https://<application-url>?ssoaction=login&appid=<app-id>
  • Efter inloggning kommer du att omdirigeras tillbaka till din frontend-applikation, då kommer du att bli tvungen att göra en API-anrop att få token och användarinformation.
  • Nedan följer exempelkoden du kan använda för att göra API-anropet till token endpoint för att hämta token från frontend-sidan.
  • fetch("https://<backend-api-baseurl>/api/gettoken", {
      method: "GET",
    })
    .then((response) => {
      //here you will receive the jwt token and the user details
      console.log(response);
    });
  • Starta din ASP.NET Core Web API-applikation
  • Starta din frontend-applikation
  • Från frontend-applikationen klickar du på SSO -inloggning knappen du har lagt till
  • Efter SAML-inloggning, Du kommer att omdirigeras tillbaka till din frontend-applikation. Vid det här laget anropar din frontend-applikation /api/gettoken slutpunkten, som returnerar token och användaruppgifterna. Du kan använda JWT-token för att göra dina ytterligare API-anrop.
JWT-token

Obs: Om du använder attributet Authorize i API:et för tokenvalidering måste du ange autentiseringspolicyn eftersom vi nu har flera policyer registrerade.

För JWT-användning: [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]


Hör av dig till oss på aspnetsupport@xecurify.com, och vårt team hjälper dig att konfigurera ASP.NET Core SAML SSO. Vårt team hjälper dig att välja den bästa lösningen/planen utifrån dina behov.

ADFS_sso ×
Hej där!

Behövs hjälp? Vi är här!

stödja