Configurare l'autenticazione di Windows in ASP.NET CoreConfigure Windows Authentication in ASP.NET Core

Steve Smith e Scott AddieBy Steve Smith and Scott Addie

L'autenticazione di Windows possono essere configurato per le app ASP.NET Core con IIS, ospitate HTTP. sys, o WebListener.Windows Authentication can be configured for ASP.NET Core apps hosted with IIS, HTTP.sys, or WebListener.

Autenticazione di WindowsWindows Authentication

L'autenticazione di Windows si basa sul sistema operativo per autenticare gli utenti delle App ASP.NET Core.Windows Authentication relies on the operating system to authenticate users of ASP.NET Core apps. È possibile usare l'autenticazione di Windows quando il server in esecuzione in una rete aziendale usando le identità di dominio Active Directory o altri account di Windows per identificare gli utenti.You can use Windows Authentication when your server runs on a corporate network using Active Directory domain identities or other Windows accounts to identify users. L'autenticazione di Windows è più adatta agli ambienti intranet in cui gli utenti, le applicazioni client e server web appartengono allo stesso dominio di Windows.Windows Authentication is best suited to intranet environments in which users, client applications, and web servers belong to the same Windows domain.

Altre informazioni sull'autenticazione di Windows e di installarlo per IIS.Learn more about Windows Authentication and installing it for IIS.

Abilitare l'autenticazione di Windows in un'app ASP.NET CoreEnable Windows Authentication in an ASP.NET Core app

Il modello di applicazione Web di Visual Studio può essere configurato per supportare l'autenticazione di Windows.The Visual Studio Web Application template can be configured to support Windows Authentication.

Usare il modello di app di autenticazione di WindowsUse the Windows Authentication app template

In Visual Studio:In Visual Studio:

  1. Creare una nuova applicazione Web ASP.NET Core.Create a new ASP.NET Core Web Application.
  2. Selezionare l'applicazione Web dall'elenco dei modelli.Select Web Application from the list of templates.
  3. Selezionare il Modifica autenticazione e selezionare l'autenticazione di Windows.Select the Change Authentication button and select Windows Authentication.

Eseguire l'app.Run the app. Il nome utente viene visualizzato nell'angolo superiore destro dell'app.The username appears in the top right of the app.

Schermata di Browser l'autenticazione di Windows

Per progetti di sviluppo tramite IIS Express, il modello fornisce tutta la configurazione necessaria per usare l'autenticazione di Windows.For development work using IIS Express, the template provides all the configuration necessary to use Windows Authentication. La sezione seguente illustra come configurare manualmente un'app ASP.NET Core per l'autenticazione di Windows.The following section shows how to manually configure an ASP.NET Core app for Windows Authentication.

Impostazioni di Visual Studio per Windows e l'autenticazione anonimaVisual Studio settings for Windows and anonymous authentication

Il progetto di Visual Studio delle proprietà della pagina Debug scheda fornisce caselle di controllo per l'autenticazione di Windows e l'autenticazione anonima.The Visual Studio project Properties page's Debug tab provides check boxes for Windows Authentication and anonymous authentication.

Schermata del Browser l'autenticazione di Windows con le opzioni di autenticazione evidenziate

In alternativa, è possibile configurare queste due proprietà nel launchsettings. JSON file:Alternatively, these two properties can be configured in the launchSettings.json file:

{
    "iisSettings": {
        "windowsAuthentication": true,
        "anonymousAuthentication": false,
        "iisExpress": {
            "applicationUrl": "http://localhost:52171/",
            "sslPort": 0
        }
    } // additional options trimmed
}

Abilitare l'autenticazione di Windows con IISEnable Windows Authentication with IIS

IIS Usa il modulo di ASP.NET Core per ospitare App ASP.NET Core.IIS uses the ASP.NET Core Module to host ASP.NET Core apps. L'autenticazione di Windows è configurata in IIS, non l'app.Windows Authentication is configured in IIS, not the app. Le sezioni seguenti illustrano come usare Gestione IIS per configurare un'app ASP.NET Core per usare l'autenticazione di Windows.The following sections show how to use IIS Manager to configure an ASP.NET Core app to use Windows Authentication.

Configurazione di IISIIS configuration

Abilitare il servizio ruolo IIS per l'autenticazione di Windows.Enable the IIS Role Service for Windows Authentication. Per altre informazioni, vedere abilitare l'autenticazione di Windows nei servizi di ruolo IIS (vedere il passaggio 2).For more information, see Enable Windows Authentication in IIS Role Services (see Step 2).

Per impostazione predefinita, il Middleware di integrazione IIS è configurato per autenticare automaticamente le richieste.IIS Integration Middleware is configured to automatically authenticate requests by default. Per altre informazioni, vedere Host ASP.NET Core in Windows con IIS: Le opzioni di IIS (AutomaticAuthentication).For more information, see Host ASP.NET Core on Windows with IIS: IIS options (AutomaticAuthentication).

Per impostazione predefinita, il modulo ASP.NET Core è configurato per inoltrare il token di autenticazione di Windows per l'app.The ASP.NET Core Module is configured to forward the Windows Authentication token to the app by default. Per altre informazioni, vedere riferimento configurazione modulo ASP.NET Core: Attributi dell'elemento aspNetCore.For more information, see ASP.NET Core Module configuration reference: Attributes of the aspNetCore element.

Creare un nuovo sito IISCreate a new IIS site

Specificare un nome e una cartella e consentirgli di creare un nuovo pool di applicazioni.Specify a name and folder and allow it to create a new application pool.

Personalizzare l'autenticazioneCustomize authentication

Aprire le funzionalità di autenticazione per il sito.Open the Authentication features for the site.

Menu di scelta l'autenticazione IIS

Disabilitare l'autenticazione anonima e abilitare l'autenticazione di Windows.Disable Anonymous Authentication and enable Windows Authentication.

Impostazioni di autenticazione IIS

Pubblicare il progetto alla cartella del sito IISPublish your project to the IIS site folder

Usa Visual Studio o .NET Core CLI, pubblicare l'app per la cartella di destinazione.Using Visual Studio or the .NET Core CLI, publish the app to the destination folder.

Finestra di dialogo di pubblicazione di Visual Studio

Altre informazioni sulle pubblicazione in IIS.Learn more about publishing to IIS.

Avviare l'app per verificare l'autenticazione di Windows.Launch the app to verify Windows Authentication is working.

Abilitare l'autenticazione di Windows con HTTP. sysEnable Windows Authentication with HTTP.sys

Anche se Kestrel non supporta l'autenticazione di Windows, è possibile usare HTTP. sys per supportare gli scenari self-hosted in Windows.Although Kestrel doesn't support Windows Authentication, you can use HTTP.sys to support self-hosted scenarios on Windows. L'esempio seguente configura l'host web dell'app per usare HTTP. sys con l'autenticazione di Windows:The following example configures the app's web host to use HTTP.sys with Windows Authentication:

public class Program
{
    public static void Main(string[] args) => 
        BuildWebHost(args).Run();

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                options.Authentication.Schemes = 
                    AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
                options.Authentication.AllowAnonymous = false;
            })
            .Build();
}

Nota

Per la delega all'autenticazione in modalità kernel, HTTP.sys usa il protocollo di autenticazione Kerberos.HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. L'autenticazione in modalità utente non è supportata con Kerberos e HTTP.sys.User mode authentication isn't supported with Kerberos and HTTP.sys. È necessario usare l'account del computer per decrittografare il token/ticket Kerberos ottenuto da Active Directory e inoltrato dal client al server per autenticare l'utente.The machine account must be used to decrypt the Kerberos token/ticket that's obtained from Active Directory and forwarded by the client to the server to authenticate the user. Registrare il nome dell'entità servizio per l'host, non l'utente dell'app.Register the Service Principal Name (SPN) for the host, not the user of the app.

Nota

Http. sys non è supportata in Nano Server versione 1709 o successiva.HTTP.sys isn't supported on Nano Server version 1709 or later. Per usare l'autenticazione di Windows e HTTP. sys con Nano Server, usare una contenitore di Server Core (microsoft/windowsservercore).To use Windows Authentication and HTTP.sys with Nano Server, use a Server Core (microsoft/windowsservercore) container. Per altre informazioni su Server Core, vedere qual è l'opzione di installazione Server Core in Windows Server?.For more information on Server Core, see What is the Server Core installation option in Windows Server?.

Abilitare l'autenticazione di Windows con WebListenerEnable Windows Authentication with WebListener

Anche se Kestrel non supporta l'autenticazione di Windows, è possibile usare WebListener per supportare gli scenari self-hosted in Windows.Although Kestrel doesn't support Windows Authentication, you can use WebListener to support self-hosted scenarios on Windows. L'esempio seguente configura l'host web dell'app per usare WebListener con l'autenticazione di Windows:The following example configures the app's web host to use WebListener with Windows Authentication:

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseWebListener(options =>
            {
                options.ListenerSettings.Authentication.Schemes = 
                    AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM;
                options.ListenerSettings.Authentication.AllowAnonymous = false;
            })
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
}

Nota

Per la delega all'autenticazione in modalità kernel, WebListener usa il protocollo di autenticazione Kerberos.WebListener delegates to kernel mode authentication with the Kerberos authentication protocol. L'autenticazione in modalità utente non è supportata con Kerberos e WebListener.User mode authentication isn't supported with Kerberos and WebListener. È necessario usare l'account del computer per decrittografare il token/ticket Kerberos ottenuto da Active Directory e inoltrato dal client al server per autenticare l'utente.The machine account must be used to decrypt the Kerberos token/ticket that's obtained from Active Directory and forwarded by the client to the server to authenticate the user. Registrare il nome dell'entità servizio per l'host, non l'utente dell'app.Register the Service Principal Name (SPN) for the host, not the user of the app.

Utilizzo con l'autenticazione di WindowsWork with Windows Authentication

Lo stato di configurazione dell'accesso anonimo determina il modo in cui il [Authorize] e [AllowAnonymous] attributi vengono usati nell'app.The configuration state of anonymous access determines the way in which the [Authorize] and [AllowAnonymous] attributes are used in the app. Le due sezioni seguenti illustrano come gestire gli Stati non consentiti e consentito la configurazione dell'accesso anonimo.The following two sections explain how to handle the disallowed and allowed configuration states of anonymous access.

Non consentire l'accesso anonimoDisallow anonymous access

Quando è abilitata l'autenticazione di Windows e accesso anonimo è disabilitato, il [Authorize] e [AllowAnonymous] attributi non hanno alcun effetto.When Windows Authentication is enabled and anonymous access is disabled, the [Authorize] and [AllowAnonymous] attributes have no effect. Se il sito IIS (o server HTTP. sys o WebListener) è configurato per non consentire l'accesso anonimo, la richiesta raggiunga mai l'app.If the IIS site (or HTTP.sys or WebListener server) is configured to disallow anonymous access, the request never reaches your app. Per questo motivo, il [AllowAnonymous] attributo non è applicabile.For this reason, the [AllowAnonymous] attribute isn't applicable.

Consenti accesso anonimoAllow anonymous access

Quando sono abilitati sia l'autenticazione di Windows e l'accesso anonimo, usare il [Authorize] e [AllowAnonymous] attributi.When both Windows Authentication and anonymous access are enabled, use the [Authorize] and [AllowAnonymous] attributes. Il [Authorize] attributo consente di proteggere parti dell'app che realmente richiedono l'autenticazione di Windows.The [Authorize] attribute allows you to secure pieces of the app which truly do require Windows Authentication. Il [AllowAnonymous] esegue l'override dell'attributo [Authorize] utilizzo all'interno delle App che consentono l'accesso anonimo degli attributi.The [AllowAnonymous] attribute overrides [Authorize] attribute usage within apps which allow anonymous access. Visualizzare autorizzazione semplice per informazioni dettagliate sull'utilizzo di attributi.See Simple Authorization for attribute usage details.

In ASP.NET Core 2.x, il [Authorize] attributo richiede una configurazione aggiuntiva nel Startup.cs per stimolare le richieste anonime per l'autenticazione di Windows.In ASP.NET Core 2.x, the [Authorize] attribute requires additional configuration in Startup.cs to challenge anonymous requests for Windows Authentication. La configurazione consigliata varia leggermente in base sul server web in uso.The recommended configuration varies slightly based on the web server being used.

Nota

Per impostazione predefinita, gli utenti che non dispongono di autorizzazione per accedere a una pagina vengono visualizzati una risposta HTTP 403 vuota.By default, users who lack authorization to access a page are presented with an empty HTTP 403 response. Il StatusCodePages middleware può essere configurato per fornire agli utenti una migliore esperienza di "Accesso negato".The StatusCodePages middleware can be configured to provide users with a better "Access Denied" experience.

IISIIS

Se si usa IIS, aggiungere il codice seguente il ConfigureServices metodo:If using IIS, add the following to the ConfigureServices method:

// IISDefaults requires the following import:
// using Microsoft.AspNetCore.Server.IISIntegration;
services.AddAuthentication(IISDefaults.AuthenticationScheme);

HTTP.sysHTTP.sys

Se si Usa HTTP. sys, aggiungere il codice seguente il ConfigureServices metodo:If using HTTP.sys, add the following to the ConfigureServices method:

// HttpSysDefaults requires the following import:
// using Microsoft.AspNetCore.Server.HttpSys;
services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);

RappresentazioneImpersonation

ASP.NET Core non implementa la rappresentazione.ASP.NET Core doesn't implement impersonation. Le app vengono eseguite con l'identità dell'applicazione per tutte le richieste, usando l'identità del pool o un processo dell'app.Apps run with the application identity for all requests, using app pool or process identity. Se è necessario eseguire in modo esplicito un'azione per conto di un utente, usare WindowsIdentity.RunImpersonated.If you need to explicitly perform an action on behalf of a user, use WindowsIdentity.RunImpersonated. Eseguire una singola azione in questo contesto e quindi chiudere il contesto.Run a single action in this context and then close the context.

app.Run(async (context) =>
{
    try
    {
        var user = (WindowsIdentity)context.User.Identity;

        await context.Response
                     .WriteAsync($"User: {user.Name}\tState: {user.ImpersonationLevel}\n");

        WindowsIdentity.RunImpersonated(user.AccessToken, () =>
        {
            var impersonatedUser = WindowsIdentity.GetCurrent();
            var message =
                $"User: {impersonatedUser.Name}\tState: {impersonatedUser.ImpersonationLevel}";

            var bytes = Encoding.UTF8.GetBytes(message);
            context.Response.Body.Write(bytes, 0, bytes.Length);
        });
    }
    catch (Exception e)
    {
        await context.Response.WriteAsync(e.ToString());
    }
});

Si noti che RunImpersonated non supporta operazioni asincrone e non deve essere usata per scenari complessi.Note that RunImpersonated doesn't support asynchronous operations and shouldn't be used for complex scenarios. Ad esempio, di wrapping delle richieste intere o catene di middleware, non è supportato o consigliato.For example, wrapping entire requests or middleware chains isn't supported or recommended.