Dela via


Autentisera användare med WS-Federation i ASP.NET Core

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Den här handledningen visar hur du gör det möjligt för användare att logga in via en WS-Federation autentiseringsleverantör som Active Directory Federation Services (ADFS) eller Microsoft Entra ID. Den använder exempelappen ASP.NET Core som beskrivs i Facebook, Google och extern providerautentisering.

För ASP.NET Core-appar tillhandahålls WS-Federation support av Microsoft.AspNetCore.Authentication.WsFederation. Den här komponenten är portad från Microsoft.Owin.Security.WsFederation och delar många av komponentens mekanik. Komponenterna skiljer sig dock åt på ett par viktiga sätt.

Som standard är det nya mellanprogrammet:

  • Tillåter inte oönskade inloggningar. Den här funktionen i WS-Federation-protokollet är sårbar för XSRF-attacker. Det kan dock aktiveras med alternativet AllowUnsolicitedLogins .
  • Kontrollerar inte alla formulärinlägg för inloggningsmeddelanden. Endast begäranden till CallbackPath kontrolleras vid inloggning. CallbackPath har som standardvärde /signin-wsfed, men detta kan ändras via egenskapen RemoteAuthenticationOptions.CallbackPath som ärvs från klassen WsFederationOptions. Den här sökvägen kan delas med andra autentiseringsprovidrar genom att aktivera alternativet SkipUnrecognizedRequests .

Registrera appen med Active Directory

Federationstjänster för Active Directory

  • Öppna serverns guiden Lägg till förlitande partförtroende från ADFS-hanteringskonsolen:

Guiden Lägg till förtroende för förlitande part: Välkommen

  • Välj att ange data manuellt:

Guiden Lägg till förtroende för förlitande part: Välj datakälla

Guiden Lägg till förtroende för förlitande part: Konfigurera certifikat

  • Aktivera stöd för WS-Federation passivt protokoll med hjälp av appens URL. Kontrollera att porten är korrekt för appen:

Lägg till guide för förtroende för förlitande part: Konfigurera URL

Anmärkning

Detta måste vara en HTTPS-URL. IIS Express kan tillhandahålla ett självsignerat certifikat när du är värd för appen under utvecklingen. Kestrel kräver manuell certifikatkonfiguration. Mer information finns i dokumentationenKestrel.

  • Klicka på Nästa i resten av guiden och Stäng i slutet.

  • ASP.NET Core Identity kräver ett NamnID-krav . Lägg till en från dialogrutan Redigera anspråksregler :

Redigera anspråksregler

  • I guiden Lägg till regel för transformeringsanspråk lämnar du standardmallen Skicka LDAP-attribut som anspråk markerad och klickar på Nästa. Lägg till en regel som mappar LDAP-attributet SAM-Account-Name till utgående anspråk för namn-ID :

Guiden Lägg till och omvandla anspråksregel: Konfigurera anspråksregel

  • Klicka på Slutför>OK i fönstret Redigera anspråksregler .

Microsoft Entra ID

  • Gå till sidan för appregistreringar för Microsoft Entra ID-tenanten. Klicka på Ny programregistrering:

Microsoft Entra-ID: Appregistreringar

  • Ange ett namn för appregistreringen. Detta är inte viktigt för ASP.NET Core-appen.
  • Ange den URL som appen lyssnar på som inloggnings-URL:

Microsoft Entra-ID: Skapa appregistrering

  • Klicka på Slutpunkter och notera url:en för federationsmetadatadokumentet . Det här är WS-Federation mellanprogram:MetadataAddress

Microsoft Entra-ID: Slutpunkter

  • Gå till den nya appregistreringen. Klicka på Exponera ett API. Klicka på Program-ID URI Ange>Spara. Anteckna applikations-ID-URI. Det här är WS-Federation mellanprogram:Wtrealm

Microsoft Entra-ID: Egenskaper för appregistrering

Använd WS-Federation utan ASP.NET Core Identity

Det WS-Federation mellanprogrammet kan användas utan Identity. Till exempel:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
    })
     .AddWsFederation(options =>
     {
         options.Wtrealm = Configuration["wsfed:realm"];
         options.MetadataAddress = Configuration["wsfed:metadata"];
     })
     .AddCookie();

    services.AddControllersWithViews();
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapRazorPages();
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
    })
    .AddWsFederation(options =>
    {
        options.Wtrealm = Configuration["wsfed:realm"];
        options.MetadataAddress = Configuration["wsfed:metadata"];
    })
    .AddCookie();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseAuthentication();

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

Lägg till WS-Federation som extern inloggningsprovider för ASP.NET Core Identity

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();


    services.AddAuthentication()
        .AddWsFederation(options =>
        {
            // MetadataAddress represents the Active Directory instance used to authenticate users.
            options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";

            // Wtrealm is the app's identifier in the Active Directory instance.
            // For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
            options.Wtrealm = "https://localhost:44307/";

            // For AAD, use the Application ID URI from the app registration's Overview blade:
            options.Wtrealm = "api://bbd35166-7c13-49f3-8041-9551f2847b69";
        });

    services.AddControllersWithViews();
    services.AddRazorPages();
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddAuthentication()
        .AddWsFederation(options =>
        {
            // MetadataAddress represents the Active Directory instance used to authenticate users.
            options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";

            // Wtrealm is the app's identifier in the Active Directory instance.
            // For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
            options.Wtrealm = "https://localhost:44307/";

            // For AAD, use the Application ID URI from the app registration's Overview blade:
            options.Wtrealm = "api://bbd35166-7c13-49f3-8041-9551f2847b69";
        });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Överbelastningen AddAuthentication(IServiceCollection, String) ställer in egenskapen DefaultScheme. Med AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) överlagring kan du konfigurera autentiseringsalternativ, som kan användas för att konfigurera standardautentiseringsscheman för olika syften. Efterföljande anrop till AddAuthentication åsidosätter tidigare konfigurerade egenskaper för AuthenticationOptions.

AuthenticationBuilder tilläggsmetoder som registrerar en autentiseringshanterare kan bara anropas en gång per autentiseringsschema. Det finns överlagringar som gör det möjligt att konfigurera schemaegenskaper, schemanamn och visningsnamn.

Logga in med WS-Federation

Bläddra till appen och klicka på länken Logga in i navigeringshuvudet. Det finns ett alternativ för att logga in med WsFederation:

Inloggningssida

Med ADFS som provider omdirigeras knappen till en ADFS-inloggningssida:

Inloggningssida för ADFS

Med Microsoft Entra-ID som provider omdirigeras knappen till inloggningssidan för Microsoft Entra-ID:

Inloggningssida för Microsoft Entra-ID

En lyckad inloggning för en ny användare omdirigeras till appens användarregistreringssida:

Registrera sida