Číst v angličtině

Sdílet prostřednictvím


Ověřování uživatelů pomocí WS-Federation v ASP.NET Core

Tento kurz ukazuje, jak uživatelům umožnit přihlášení pomocí zprostředkovatele ověřování WS-Federation, jako je Active Directory Federation Services (AD FS) (ADFS) nebo Microsoft Entra ID. Používá ukázkovou aplikaci ASP.NET Core popsanou v ověřování externího poskytovatele na Facebooku, Googlu a externím poskytovateli.

Pro aplikace ASP.NET Core poskytuje podpora WS-Federation microsoft.AspNetCore.Authentication.WsFederation. Tato komponenta je portována z Microsoft.Owin.Security.WsFederation a sdílí mnoho z mechaniky této komponenty. Komponenty se ale liší několika důležitými způsoby.

Ve výchozím nastavení nový middleware:

  • Nepovoluje nevyžádaná přihlášení. Tato funkce protokolu WS-Federation je zranitelná vůči útokům XSRF. Tuto možnost ale můžete povolit AllowUnsolicitedLogins .
  • Nekontroluje všechny příspěvky formuláře pro přihlášení. Zkontrolují se pouze požadavky na CallbackPath přihlášení. CallbackPath Ve výchozím nastavení je /signin-wsfed možné je změnit prostřednictvím zděděné RemoteAuthenticationOptions.CallbackPath vlastnosti WsFederationOptions třídy. Tuto cestu můžete sdílet s dalšími zprostředkovateli ověřování tím, že tuto SkipUnrecognizedRequests možnost povolíte.

Registrace aplikace ve službě Active Directory

Active Directory Federation Services

  • V konzole pro správu ADFS otevřete Průvodce přidáním vztahu důvěryhodnosti předávající strany:

Průvodce přidáním vztahu důvěryhodnosti předávající strany: Vítejte

  • Zvolte ruční zadávání dat:

Průvodce přidáním vztahu důvěryhodnosti předávající strany: Výběr zdroje dat

  • Zadejte zobrazovaný název předávající strany. Název není pro aplikaci ASP.NET Core důležitý.

  • Microsoft.AspNetCore.Authentication.WsFederation nemá podporu šifrování tokenů, proto nekonfigurujte šifrovací certifikát tokenu:

Průvodce přidáním vztahu důvěryhodnosti předávající strany: Konfigurace certifikátu

  • Povolte podporu pasivního protokolu WS-Federation pomocí adresy URL aplikace. Ověřte správnost portu pro aplikaci:

Průvodce přidáním vztahu důvěryhodnosti předávající strany: Konfigurace adresy URL

Poznámka

Musí se jednat o adresu URL HTTPS. Služba IIS Express může poskytnout certifikát podepsaný svým držitelem při hostování aplikace během vývoje. Kestrel vyžaduje ruční konfiguraci certifikátu. Další podrobnosti najdete v Kestrel dokumentaci .

  • Klikněte na Tlačítko Další v rest průvodci a na konci zavřete .

  • ASP.NET Core Identity vyžaduje deklaraci ID názvu . Přidejte ho z dialogového okna Upravit pravidla deklarací identity:

Upravit pravidla deklarací identity

  • V Průvodci přidáním pravidla deklarace identity transformace ponechte výchozí možnost Odeslat atributy LDAP jako vybranou šablonu deklarací identity a klepněte na tlačítko Další. Přidejte pravidlo, které mapuje atribut LDAP SAM-Account-Name na odchozí deklaraci IDENTITY názvu :

Průvodce přidáním pravidla deklarace identity transformace: Konfigurace pravidla deklarace identity

  • V okně Upravit pravidla deklarací identity klikněte na tlačítko Dokončit>OK.

Microsoft Entra ID

  • Přejděte do okna Registrace aplikací tenanta Microsoft Entra ID. Klikněte na Nová registrace aplikace:

Microsoft Entra ID: Registrace aplikací

  • Zadejte název registrace aplikace. To není pro aplikaci ASP.NET Core důležité.
  • Zadejte adresu URL, na které aplikace naslouchá, jako přihlašovací adresa URL:

ID Microsoft Entra: Vytvoření registrace aplikace

  • Klikněte na koncové body a poznamenejte si adresu URL dokumentu federačních metadat. Toto je middleware MetadataAddressWS-Federation:

MICROSOFT Entra ID: Koncové body

  • Přejděte na novou registraci aplikace. Klikněte na Zveřejnit rozhraní API. Klikněte na uložit identifikátor URI >ID aplikace. Poznamenejte si identifikátor URI ID aplikace. Toto je middleware WtrealmWS-Federation:

ID Microsoft Entra: Vlastnosti registrace aplikace

Použití WS-Federation bez ASP.NET Core Identity

Middleware WS-Federation lze použít bez Identity. Příklad:

C#
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();
    });
}
C#
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?}");
    });
}

Přidání WS-Federation jako externího zprostředkovatele přihlášení pro ASP.NET Core Identity

C#
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();
}
C#
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);
}

Přetížení AddAuthentication(IServiceCollection, String) nastaví DefaultScheme vlastnost. Přetížení AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) umožňuje konfigurovat možnosti ověřování, které lze použít k nastavení výchozích schémat ověřování pro různé účely. Další volání k AddAuthentication přepsání dříve nakonfigurovaných AuthenticationOptions vlastností

AuthenticationBuilder metody rozšíření, které registrují obslužnou rutinu ověřování, mohou být volána pouze jednou pro každé schéma ověřování. Existují přetížení, která umožňují konfigurovat vlastnosti schématu, název schématu a zobrazovaný název.

Přihlášení pomocí WS-Federation

Přejděte do aplikace a klikněte na odkaz Přihlásit se v navigačním záhlaví. Možnost přihlášení pomocí WsFederation: Přihlašovací stránka

S ADFS jako poskytovatelem se tlačítko přesměruje na přihlašovací stránku ADFS: Přihlašovací stránka ADFS

S ID Microsoft Entra jako poskytovatelem se tlačítko přesměruje na přihlašovací stránku Microsoft Entra ID: Přihlašovací stránka Microsoft Entra ID

Úspěšné přihlášení nového uživatele se přesměruje na stránku registrace uživatele aplikace: Zaregistrovat stránku