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

Dal Scott Addie e Luke LathamBy Scott Addie and Luke Latham

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

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 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 Windows accounts to identify users. L'autenticazione di Windows è più adatta agli ambienti intranet in cui gli utenti, le app client e server web appartengono allo stesso dominio di Windows.Windows Authentication is best suited to intranet environments where users, client apps, and web servers belong to the same Windows domain.

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

Il applicazione Web modello disponibile tramite la CLI di .NET Core o Visual Studio possono essere configurato per supportare l'autenticazione di Windows.The Web Application template available via Visual Studio or the .NET Core CLI can be configured to support Windows Authentication.

Usare il modello di app di autenticazione di Windows per un nuovo progettoUse the Windows Authentication app template for a new project

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 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'interfaccia utente dell'app sottoposto a rendering.The username appears in the rendered app's user interface.

Configurazione manuale per un progetto esistenteManual configuration for an existing project

Le proprietà del progetto consentono di abilitare l'autenticazione di Windows e disabilitare l'autenticazione anonima:The project's properties allow you to enable Windows Authentication and disable Anonymous Authentication:

  1. Fare clic sul progetto in Visual Studio Esplora soluzioni e selezionare proprietà.Right-click the project in Visual Studio's Solution Explorer and select Properties.
  2. Selezionare la scheda Debug.Select the Debug tab.
  3. Deselezionare la casella di controllo abilitare l'autenticazione anonima.Clear the check box for Enable Anonymous Authentication.
  4. Selezionare la casella di controllo abilitare l'autenticazione di Windows.Select the check box for Enable Windows Authentication.

In alternativa, è possibile configurare le proprietà nel iisSettings nodo il launchsettings. JSON file:Alternatively, the properties can be configured in the iisSettings node of the launchSettings.json file:

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

Quando si modifica un progetto esistente, verificare che il file di progetto include un riferimento al pacchetto per il metapacchetto Microsoft.AspNetCore.App oppure il Microsoft.AspNetCore.Authentication pacchetto NuGet.When modifying an existing project, confirm that the project file includes a package reference for the Microsoft.AspNetCore.App metapackage or the Microsoft.AspNetCore.Authentication NuGet package.

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 è configurato per IIS tramite il Web. config file.Windows Authentication is configured for IIS via the web.config file. Le sezioni seguenti mostrano come:The following sections show how to:

  • Specificare una variabile locale Web. config file che attiva l'autenticazione di Windows nel server quando l'app viene distribuita.Provide a local web.config file that activates Windows Authentication on the server when the app is deployed.
  • Usare Gestione IIS per configurare il Web. config file di un'app ASP.NET Core che è già stata distribuita nel server.Use the IIS Manager to configure the web.config file of an ASP.NET Core app that has already been deployed to the server.

Configurazione di IISIIS configuration

Se non già stato fatto, abilitare IIS per ospitare App ASP.NET Core.If you haven't already done so, enable IIS to host ASP.NET Core apps. Per altre informazioni, vedere Host ASP.NET Core in Windows con IIS.For more information, see Host ASP.NET Core in Windows con IIS.

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.

Abilitare l'autenticazione di Windows per le app in IIS.Enable Windows Authentication for the app in IIS

Uso entrambi degli approcci seguenti:Use either of the following approaches:

Configurazione di sviluppo-side con un file Web. config localeDevelopment-side configuration with a local web.config file

Eseguire la procedura seguente prima si pubblicare e distribuire il progetto.Perform the following steps before you publish and deploy your project.

Aggiungere il codice seguente Web. config file alla radice del progetto:Add the following web.config file to the project root:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <security>
        <authentication>
          <anonymousAuthentication enabled="false" />
          <windowsAuthentication enabled="true" />
        </authentication>
      </security>
    </system.webServer>
  </location>
</configuration>

Quando il progetto viene pubblicato dal SDK (senza il <IsTransformWebConfigDisabled> impostata su true nel file di progetto), pubblicato Web. config file include il <location><system.webServer><security><authentication> sezione.When the project is published by the SDK (without the <IsTransformWebConfigDisabled> property set to true in the project file), the published web.config file includes the <location><system.webServer><security><authentication> section. Per altre informazioni sul <IsTransformWebConfigDisabled> proprietà, vedere Host ASP.NET Core in Windows con IIS.For more information on the <IsTransformWebConfigDisabled> property, see Host ASP.NET Core in Windows con IIS.

Configurazione lato server con Gestione IISServer-side configuration with the IIS Manager

Eseguire la procedura seguente dopo aver si pubblicare e distribuire il progetto.Perform the following steps after you publish and deploy your project.

  1. In Gestione IIS selezionare il sito IIS sotto il siti nodo del connessioni nella barra laterale.In IIS Manager, select the IIS site under the Sites node of the Connections sidebar.
  2. Fare doppio clic su Authentication nel IIS area.Double-click Authentication in the IIS area.
  3. Selezionare l'autenticazione anonima.Select Anonymous Authentication. Selezionare disabilitare nel azioni nella barra laterale.Select Disable in the Actions sidebar.
  4. Selezionare Windows autenticazione.Select Windows Authentication. Selezionare abilitare nel azioni nella barra laterale.Select Enable in the Actions sidebar.

Quando vengono eseguite queste operazioni, Gestione IIS modifica dell'app Web. config file.When these actions are taken, IIS Manager modifies the app's web.config file. Oggetto <system.webServer><security><authentication> nodo viene aggiunto con impostazioni aggiornate per anonymousAuthentication e windowsAuthentication:A <system.webServer><security><authentication> node is added with updated settings for anonymousAuthentication and windowsAuthentication:

<system.webServer>
  <security>
    <authentication>
      <anonymousAuthentication enabled="false" />
      <windowsAuthentication enabled="true" />
    </authentication>
  </security>
</system.webServer>

Il <system.webServer> aggiunto alla sezione di Web. config file da Gestione IIS è di fuori dell'app <location> sezione aggiunte per .NET Core SDK quando la pubblicazione dell'app.The <system.webServer> section added to the web.config file by IIS Manager is outside of the app's <location> section added by the .NET Core SDK when the app is published. Poiché la sezione viene aggiunta di fuori del <location> nodo, le impostazioni vengono ereditate da qualsiasi App secondarie all'app corrente.Because the section is added outside of the <location> node, the settings are inherited by any sub-apps to the current app. Per impedire l'ereditarietà, spostare l'aggiunta <security> all'interno della sezione di <location><system.webServer> sezione in cui il SDK fornito.To prevent inheritance, move the added <security> section inside of the <location><system.webServer> section that the SDK provided.

Quando Gestione IIS consente di aggiungere la configurazione di IIS, questo interessa solo l'app Web. config file sul server.When IIS Manager is used to add the IIS configuration, it only affects the app's web.config file on the server. Una distribuzione dell'app per le successive possa sovrascrivere le impostazioni nel server se la copia del server del Web. config viene sostituita da del progetto Web. config file.A subsequent deployment of the app may overwrite the settings on the server if the server's copy of web.config is replaced by the project's web.config file. Uso entrambi degli approcci seguenti per gestire le impostazioni:Use either of the following approaches to manage the settings:

  • Utilizzare Gestione IIS per reimpostare le impostazioni nel Web. config file dopo che il file viene sovrascritto nella distribuzione.Use IIS Manager to reset the settings in the web.config file after the file is overwritten on deployment.
  • Aggiungere un file Web. config all'app in locale con le impostazioni.Add a web.config file to the app locally with the settings. Per altre informazioni, vedere la configurazione lato sviluppo sezione.For more information, see the Development-side configuration section.

Pubblicare e distribuire il progetto alla cartella del sito IISPublish and deploy your project to the IIS site folder

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

Per altre informazioni sull'hosting con IIS, pubblicazione e distribuzione, vedere gli argomenti seguenti:For more information on hosting with IIS, publishing, and deployment, see the following topics:

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?.

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 HTTP. sys) è configurato per non consentire l'accesso anonimo, la richiesta raggiunga mai l'app.If the IIS site (or HTTP.sys) 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'app per tutte le richieste, usando l'identità del pool o un processo dell'app.Apps run with the app's 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 in un middleware inline terminal in Startup.Configure.If you need to explicitly perform an action on behalf of a user, use WindowsIdentity.RunImpersonated in a terminal inline middleware in Startup.Configure. 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}\t" +
                $"State: {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());
    }
});

RunImpersonated non supporta operazioni asincrone e non deve essere usata per scenari complessi.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.