Infrastruttura di sicurezza: gestione della sessione - ArticoliSecurity Frame: Session Management | Articles

Prodotto o servizioProduct/Service ArticoloArticle
Azure ADAzure AD
Dispositivo IoTIoT Device
Azure Document DBAzure Document DB
AD FSADFS
Identity ServerIdentity Server
Applicazione WebWeb Application
API WebWeb API

Implementare la disconnessione appropriata con i metodi ADAL quando si usa Azure ADImplement proper logout using ADAL methods when using Azure AD

TitoloTitle DettagliDetails
ComponenteComponent Azure ADAzure AD
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps Se l'applicazione si basa su un token di accesso rilasciato da Azure AD, il gestore eventi di disconnessione eseguirà la chiamata.If the application relies on access token issued by Azure AD, the logout event handler should call

EsempioExample

HttpContext.GetOwinContext().Authentication.SignOut(OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType)

EsempioExample

Eliminerà anche definitivamente la sessione dell'utente chiamando il metodo Session.Abandon().It should also destroy user's session by calling Session.Abandon() method. Il metodo seguente illustra l'implementazione sicura della disconnessione utente:Following method shows secure implementation of user logout:

    [HttpPost]
        [ValidateAntiForgeryToken]
        public void LogOff()
        {
            string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
            AuthenticationContext authContext = new AuthenticationContext(Authority + TenantId, new NaiveSessionCache(userObjectID));
            authContext.TokenCache.Clear();
            Session.Clear();
            Session.Abandon();
            Response.SetCookie(new HttpCookie("ASP.NET_SessionId", string.Empty));
            HttpContext.GetOwinContext().Authentication.SignOut(
                OpenIdConnectAuthenticationDefaults.AuthenticationType,
                CookieAuthenticationDefaults.AuthenticationType);
        } 

Usare durate limitate per i token di firma di accesso condiviso generatiUse finite lifetimes for generated SaS tokens

TitoloTitle DettagliDetails
ComponenteComponent Dispositivo IoTIoT Device
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps I token di firma di accesso condiviso generati per l'autenticazione all'hub IoT di Azure devono avere un periodo di validità limitato.SaS tokens generated for authenticating to Azure IoT Hub should have a finite expiry period. Impostare durate minime per i token di firma di accesso condiviso per limitare il periodo di tempo in cui i token possono essere riprodotti nel caso in cui vengano compromessi.Keep the SaS token lifetimes to a minimum to limit the amount of time they can be replayed in case the tokens are compromised.

Usare durate minime per i token delle risorse generatiUse minimum token lifetimes for generated Resource tokens

TitoloTitle DettagliDetails
ComponenteComponent Azure DocumentDBAzure Document DB
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps Ridurre l'intervallo di tempo del token della risorsa a un valore minimo necessario.Reduce the timespan of resource token to a minimum value required. I token delle risorse hanno un intervallo di tempo valido predefinito di 1 ora.Resource tokens have a default valid timespan of 1 hour.

Implementare la disconnessione appropriata con i metodi WsFederation quando si usa AD FSImplement proper logout using WsFederation methods when using ADFS

TitoloTitle DettagliDetails
ComponenteComponent AD FSADFS
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps Se l'applicazione si basa sul token del servizio token di sicurezza rilasciato da AD FS, il gestore eventi di disconnessione chiamerà il metodo WSFederationAuthenticationModule.FederatedSignOut() per disconnettere l'utente.If the application relies on STS token issued by ADFS, the logout event handler should call WSFederationAuthenticationModule.FederatedSignOut() method to log out the user. Verrà anche eliminata definitivamente la sessione corrente e il valore del token della sessione verrà reimpostato e reso null.Also the current session should be destroyed, and the session token value should be reset and nullified.

EsempioExample

        [HttpPost, ValidateAntiForgeryToken]
        [Authorization]
        public ActionResult SignOut(string redirectUrl)
        {
            if (!this.User.Identity.IsAuthenticated)
            {
                return this.View("LogOff", null);
            }

            // Removes the user profile.
            this.Session.Clear();
            this.Session.Abandon();
            HttpContext.Current.Response.Cookies.Add(new System.Web.HttpCookie("ASP.NET_SessionId", string.Empty)
                {
                    Expires = DateTime.Now.AddDays(-1D),
                    Secure = true,
                    HttpOnly = true
                });

            // Signs out at the specified security token service (STS) by using the WS-Federation protocol.
            Uri signOutUrl = new Uri(FederatedAuthentication.WSFederationAuthenticationModule.Issuer);
            Uri replyUrl = new Uri(FederatedAuthentication.WSFederationAuthenticationModule.Realm);
            if (!string.IsNullOrEmpty(redirectUrl))
            {
                replyUrl = new Uri(FederatedAuthentication.WSFederationAuthenticationModule.Realm + redirectUrl);
            }
           //     Signs out of the current session and raises the appropriate events.
            var authModule = FederatedAuthentication.WSFederationAuthenticationModule;
            authModule.SignOut(false);
        //     Signs out at the specified security token service (STS) by using the WS-Federation
        //     protocol.            
            WSFederationAuthenticationModule.FederatedSignOut(signOutUrl, replyUrl);
            return new RedirectResult(redirectUrl);
        }

Implementare la disconnessione appropriata quando si usa Identity ServerImplement proper logout when using Identity Server

TitoloTitle DettagliDetails
ComponenteComponent Identity ServerIdentity Server
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences IdentityServer3: disconnessione federataIdentityServer3-Federated sign out
PassaggiSteps Identity Server supporta la federazione con i provider di identità eterni.IdentityServer supports the ability to federate with external identity providers. Quando un utente si disconnette da un provider di identità upstream, a seconda del protocollo usato, si potrebbe ricevere una notifica quando l'utente si disconnette. Ciò consente quindi a Identity Server di inviare una notifica ai client che potranno disconnettere l'utente a loro volta. Controllare la documentazione nella sezione Riferimenti per i dettagli sull'implementazione.When a user signs out of an upstream identity provider, depending upon the protocol used, it might be possible to receive a notification when the user signs out. It allows IdentityServer to notify its clients so they can also sign the user out. Check the documentation in the references section for the implementation details.

Le applicazioni disponibili tramite HTTPS devono usare cookie sicuriApplications available over HTTPS must use secure cookies

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes Tipo di ambiente: localeEnvironmentType - OnPrem
RiferimentiReferences Elemento httpCookies (schema delle impostazioni ASP.NET), Proprietà HttpCookie.SecurehttpCookies Element (ASP.NET Settings Schema), HttpCookie.Secure Property
PassaggiSteps I cookie in genere sono accessibili solo per il dominio per il cui ambito sono stati definiti.Cookies are normally only accessible to the domain for which they were scoped. La definizione di "dominio" purtroppo non include il protocollo, quindi i cookie creati tramite HTTPS sono accessibile tramite HTTP.Unfortunately, the definition of "domain" does not include the protocol so cookies that are created over HTTPS are accessible over HTTP. L'attributo "secure" indica al browser che il cookie deve essere disponibile solo tramite HTTPS.The "secure" attribute indicates to the browser that the cookie should only be made available over HTTPS. Assicurarsi che tutti i cookie impostati tramite HTTPS usino l'attributo secure.Ensure that all cookies set over HTTPS use the secure attribute. Il requisito può essere applicato nel file web.config impostando l'attributo requireSSL su true.The requirement can be enforced in the web.config file by setting the requireSSL attribute to true. Si tratta dell'approccio da preferire perché applicherà l'attributo secure per tutti i cookie correnti e futuri senza dover apportare altre modifiche al codice.It is the preferred approach because it will enforce the secure attribute for all current and future cookies without the need to make any additional code changes.

EsempioExample

<configuration>
  <system.web>
    <httpCookies requireSSL="true"/>
  </system.web>
</configuration>

L'impostazione viene applicata anche se viene usato HTTP per accedere all'applicazione.The setting is enforced even if HTTP is used to access the application. Se viene usato HTTP per accedere all'applicazione, l'impostazione interrompe l'applicazione perché i cookie vengono impostati con l'attributo secure e il browser non li invierà di nuovo all'applicazione.If HTTP is used to access the application, the setting breaks the application because the cookies are set with the secure attribute and the browser will not send them back to the application.

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies Web Form, MVC 5Web Forms, MVC5
Attributes (Attributi) (Attributi)Attributes Tipo di ambiente: localeEnvironmentType - OnPrem
RiferimentiReferences N/DN/A
PassaggiSteps Quando l'applicazione Web è la relying party e l'IdP è il server AD FS, l'attributo secure del token FedAuth può essere configurato impostando requireSSL su True nella sezione system.identityModel.services di web.config:When the web application is the Relying Party, and the IdP is ADFS server, the FedAuth token's secure attribute can be configured by setting requireSSL to True in system.identityModel.services section of web.config:

EsempioExample

  <system.identityModel.services>
    <federationConfiguration>
      <!-- Set requireSsl=true; domain=application domain name used by FedAuth cookies (Ex: .gdinfra.com); -->
      <cookieHandler requireSsl="true" persistentSessionLifetime="0.0:20:0" />
    ....  
    </federationConfiguration>
  </system.identityModel.services>
TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Secure Cookie Attribute (Attributo dei cookie Secure)Secure Cookie Attribute
PassaggiSteps Per mitigare il rischio di diffusione di informazioni con un attacco di tipo cross-site scripting (XSS), un nuovo attributo (httpOnly) è stato introdotto nei cookie ed è supportato da tutti i principali browser.To mitigate the risk of information disclosure with a cross-site scripting (XSS) attack, a new attribute - httpOnly - was introduced to cookies and is supported by all major browsers. L'attributo specifica che un cookie non è accessibile tramite script.The attribute specifies that a cookie is not accessible through script. Usando i cookie HttpOnly, un'applicazione Web riduce la possibilità che le informazioni sensibili contenute nel cookie possano essere sottratte tramite script e inviate al sito Web di un utente malintenzionato.By using HttpOnly cookies, a web application reduces the possibility that sensitive information contained in the cookie can be stolen via script and sent to an attacker's website.

EsempioExample

Tutte le applicazioni basate su HTTP che usano cookie devono specificare HttpOnly nella definizione del cookie, implementando la configurazione seguente in web.config:All HTTP-based applications that use cookies should specify HttpOnly in the cookie definition, by implementing following configuration in web.config:

<system.web>
.
.
   <httpCookies requireSSL="false" httpOnlyCookies="true"/>
.
.
</system.web>
TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies Web FormWeb Forms
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Proprietà FormsAuthentication.RequireSSLFormsAuthentication.RequireSSL Property
PassaggiSteps Il valore della proprietà RequireSSL viene impostato nel file di configurazione per un'applicazione ASP.NET usando l'attributo requireSSL dell'elemento di configurazione.The RequireSSL property value is set in the configuration file for an ASP.NET application by using the requireSSL attribute of the configuration element. È possibile specificare nel file Web.config per l'applicazione ASP.NET se SSL (Secure Sockets Layer) è necessario per restituire il cookie di autenticazione basata su form al server impostando l'attributo requireSSL.You can specify in the Web.config file for your ASP.NET application whether SSL (Secure Sockets Layer) is required to return the forms-authentication cookie to the server by setting the requireSSL attribute.

EsempioExample

L'esempio di codice seguente imposta l'attributo requireSSL nel file Web.config.The following code example sets the requireSSL attribute in the Web.config file.

<authentication mode="Forms">
  <forms loginUrl="member_login.aspx" cookieless="UseCookies" requireSSL="true"/>
</authentication>
TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies MVC 5MVC5
Attributes (Attributi) (Attributi)Attributes Tipo di ambiente: localeEnvironmentType - OnPrem
RiferimentiReferences Windows Identity Foundation (WIF) Configuration – Part II (Configurazione di Windows Identity Foundation (WIF): parte II)Windows Identity Foundation (WIF) Configuration – Part II
PassaggiSteps Per impostare l'attributo httpOnly per i cookie FedAuth, il valore dell'attributo hideFromCsript deve essere impostato su True.To set httpOnly attribute for FedAuth cookies, hideFromCsript attribute value should be set to True.

EsempioExample

La configurazione seguente illustra la configurazione corretta:Following configuration shows the correct configuration:

<federatedAuthentication>
<cookieHandler mode="Custom"
                       hideFromScript="true"
                       name="FedAuth"
                       path="/"
                       requireSsl="true"
                       persistentSessionLifetime="25">
</cookieHandler>
</federatedAuthentication>

Mitigare il rischio di attacchi basati su richieste intersito false nelle pagine Web ASP.NETMitigate against Cross-Site Request Forgery (CSRF) attacks on ASP.NET web pages

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps Richiesta intersito falsa (CSRF o XSRF) è un tipo di attacco in cui un utente malintenzionato può eseguire azioni nel contesto di protezione della sessione stabilita di un utente diverso in un sito web.Cross-site request forgery (CSRF or XSRF) is a type of attack in which an attacker can carry out actions in the security context of a different user's established session on a web site. L'obiettivo è quello di modificare o eliminare il contenuto, se il sito web di destinazione si affida esclusivamente ai cookie di sessione per autenticare la richiesta ricevuta.The goal is to modify or delete content, if the targeted web site relies exclusively on session cookies to authenticate received request. Un utente malintenzionato potrebbe sfruttare questa vulnerabilità acquisendo il browser di un altro utente per caricare un URL con un comando da un sito vulnerabile a cui l'utente è già connesso.An attacker could exploit this vulnerability by getting a different user's browser to load a URL with a command from a vulnerable site on which the user is already logged in. Un utente malintenzionato può raggiungere questo scopo in diversi modi, ad esempio ospitando un sito Web diverso che carica una risorsa dal server vulnerabile o spingendo l'utente a fare clic su un collegamento.There are many ways for an attacker to do that, such as by hosting a different web site that loads a resource from the vulnerable server, or getting the user to click a link. L'attacco può essere evitato se il server invia un token aggiuntivo al client, richiede al client di includere tale token in tutte le richieste future e verifica che tutte le richieste future includano un token relativo alla sessione corrente, ad esempio usando AntiForgeryToken o ViewState di ASP.NET.The attack can be prevented if the server sends an additional token to the client, requires the client to include that token in all future requests, and verifies that all future requests include a token that pertains to the current session, such as by using the ASP.NET AntiForgeryToken or ViewState.
TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies MVC 5, MVC 6MVC5, MVC6
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences XSRF/CSRF Prevention in ASP.NET MVC and Web Pages (Prevenzione delle richieste intersito false in ASP.NET MVC e nelle pagine Web ASP.NET)XSRF/CSRF Prevention in ASP.NET MVC and Web Pages
PassaggiSteps Form ASP.NET MVC e contro le richieste intersito: usare il metodo helper AntiForgeryToken in Views. Inserire Html.AntiForgeryToken() nel form, ad esempio,Anti-CSRF and ASP.NET MVC forms - Use the AntiForgeryToken helper method on Views; put an Html.AntiForgeryToken() into the form, for example,

EsempioExample

@using (Html.BeginForm("UserProfile", "SubmitUpdate")) { 
    @Html.ValidationSummary(true) 
    @Html.AntiForgeryToken()
    <fieldset> 

EsempioExample

<form action="/UserProfile/SubmitUpdate" method="post">
    <input name="__RequestVerificationToken" type="hidden" value="saTFWpkKN0BYazFtN6c4YbZAmsEwG0srqlUqqloi/fVgeV2ciIFVmelvzwRZpArs" />
    <!-- rest of form goes here -->
</form>

EsempioExample

Html.AntiForgeryToken() assegna contemporaneamente al visitatore un cookie denominato __RequestVerificationToken, con lo stesso valore del valore nascosto casuale illustrato sopra.At the same time, Html.AntiForgeryToken() gives the visitor a cookie called __RequestVerificationToken, with the same value as the random hidden value shown above. Per convalidare un post del form in ingresso, aggiungere quindi il filtro [ValidateAntiForgeryToken] al metodo azione di destinazione.Next, to validate an incoming form post, add the [ValidateAntiForgeryToken] filter to the target action method. ad esempio:For example:

[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
// ... etc.
}

Filtro di autorizzazione che controlla che:Authorization filter that checks that:

  • La richiesta in ingresso abbia un cookie denominato __RequestVerificationToken.The incoming request has a cookie called __RequestVerificationToken
  • La richiesta in ingresso ha un cookie Request.Form denominato __RequestVerificationTokenThe incoming request has a Request.Form entry called __RequestVerificationToken
  • Questi valori del cookie e di Request.Form corrispondono. Presumendo che sia tutto a posto, la richiesta viene completata normalmente.These cookie and Request.Form values match Assuming all is well, the request goes through as normal. In caso contrario, si verifica un errore di autorizzazione e viene visualizzato il messaggio "Token antifalsificazione non specificato o non valido".But if not, then an authorization failure with message “A required anti-forgery token was not supplied or was invalid”.

EsempioExample

Prevenzione di richieste intersito false e AJAX: il token del form può rappresentare un problema per le richieste AJAX, perché una richiesta AJAX potrebbe inviare dati JSON, non dati in formato HTML.Anti-CSRF and AJAX: The form token can be a problem for AJAX requests, because an AJAX request might send JSON data, not HTML form data. Una soluzione consiste nell'inviare i token in un'intestazione HTTP personalizzata.One solution is to send the tokens in a custom HTTP header. Il codice seguente usa la sintassi Razor per generare i token e quindi li aggiunge a una richiesta AJAX.The following code uses Razor syntax to generate the tokens, and then adds the tokens to an AJAX request.

<script>
    @functions{
        public string TokenHeaderValue()
        {
            string cookieToken, formToken;
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
            return cookieToken + ":" + formToken;                
        }
    }

    $.ajax("api/values", {
        type: "post",
        contentType: "application/json",
        data: {  }, // JSON data goes here
        dataType: "json",
        headers: {
            'RequestVerificationToken': '@TokenHeaderValue()'
        }
    });
</script>

EsempioExample

Quando si elabora la richiesta, estrarre i token dall'intestazione della richiesta.When you process the request, extract the tokens from the request header. Chiamare quindi il metodo AntiForgery.Validate per convalidare i token.Then call the AntiForgery.Validate method to validate the tokens. Il metodo Validate genera un'eccezione se i token non sono validi.The Validate method throws an exception if the tokens are not valid.

void ValidateRequestHeader(HttpRequestMessage request)
{
    string cookieToken = "";
    string formToken = "";

    IEnumerable<string> tokenHeaders;
    if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
    {
        string[] tokens = tokenHeaders.First().Split(':');
        if (tokens.Length == 2)
        {
            cookieToken = tokens[0].Trim();
            formToken = tokens[1].Trim();
        }
    }
    AntiForgery.Validate(cookieToken, formToken);
}
TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies Web FormWeb Forms
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Take Advantage of ASP.NET Built-in Features to Fend Off Web Attacks (Sfruttare le funzionalità predefinite di ASP.NET per respingere gli attacchi Web)Take Advantage of ASP.NET Built-in Features to Fend Off Web Attacks
PassaggiSteps Gli attacchi basati su richieste intersito false nelle applicazioni basate su Web Form possono essere mitigati impostando ViewStateUserKey su una stringa casuale diversa per ogni utente (ID utente o, meglio ancora, ID sessione).CSRF attacks in WebForm based applications can be mitigated by setting ViewStateUserKey to a random string that varies for each user - user ID or, better yet, session ID. Per diversi motivi tecnici e legati ai social network, l'ID sessione è molto più appropriato perché non è prevedibile, scade ed è diverso per ogni utente.For a number of technical and social reasons, session ID is a much better fit because a session ID is unpredictable, times out, and varies on a per-user basis.

EsempioExample

Ecco il codice che è necessario avere in tutte le pagine:Here's the code you need to have in all of your pages:

void Page_Init (object sender, EventArgs e) {
   ViewStateUserKey = Session.SessionID;
   :
}

Configurare una sessione per la durata dell'inattivitàSet up session for inactivity lifetime

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Proprietà HttpSessionState.TimeoutHttpSessionState.Timeout Property
PassaggiSteps Il timeout della sessione rappresenta l'evento che si verifica quando un utente non esegue alcuna azione in un sito Web durante un intervallo (definito dal server Web).Session timeout represents the event occurring when a user does not perform any action on a web site during a interval (defined by web server). L'evento sul lato server imposta lo stato della sessione utente come "non valida" (ad esempio, "non più usata") e indica al server Web di eliminarla definitivamente (eliminando tutti i dati contenuti).The event, on server side, change the status of the user session to 'invalid' (for example "not used anymore") and instruct the web server to destroy it (deleting all data contained into it). L'esempio di codice seguente imposta l'attributo del timeout della sessione su 15 minuti nel file Web.config.The following code example sets the timeout session attribute to 15 minutes in the Web.config file.

EsempioExample

\`Codice XML <configuration> <system.web> <sessionState mode="InProc" cookieless="true" timeout="15" /> </system.web> </configuration></span><span class="sxs-lookup"><span data-stu-id="d3ab3-385">`XML code <system.web> </system.web>


## <a id="threat-detection"></a>Enable Threat detection on Azure SQL
TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies Web FormWeb Forms
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Elemento forms per authentication (schema delle impostazioni ASP.NET)forms Element for authentication (ASP.NET Settings Schema)
PassaggiSteps Impostare il timeout del cookie del ticket di autenticazione basata su form su 15 minuti.Set the Forms Authentication Ticket cookie timeout to 15 minutes

EsempioExample

\`Codice XML <forms name=".ASPXAUTH" loginUrl="login.aspx" defaultUrl="default.aspx" protection="All" timeout="15" path="/" requireSSL="true" slidingExpiration="true"/> </forms></span><span class="sxs-lookup"><span data-stu-id="d3ab3-401">`XML code


| Title                   | Details      |
| ----------------------- | ------------ |
| **Component**               | Web Application | 
| **SDL Phase**               | Build |  
| **Applicable Technologies** | Web Forms, MVC5 |
| **Attributes**              | EnvironmentType - OnPrem |
| **References**              | [asdeqa](https://skf.azurewebsites.net/Mitigations/Details/wefr) |
| **Steps** | When the web application is Relying Party and ADFS is the STS, the lifetime of the authentication cookies - FedAuth tokens - can be set by the following configuration in web.config:|

### Example
```XML
  <system.identityModel.services>
    <federationConfiguration>
      <!-- Set requireSsl=true; domain=application domain name used by FedAuth cookies (Ex: .gdinfra.com); -->
      <cookieHandler requireSsl="true" persistentSessionLifetime="0.0:15:0" />
      <!-- Set requireHttps=true; -->
      <wsFederation passiveRedirectEnabled="true" issuer="http://localhost:39529/" realm="https://localhost:44302/" reply="https://localhost:44302/" requireHttps="true"/>
      <!--
      Use the code below to enable encryption-decryption of claims received from ADFS. Thumbprint value varies based on the certificate being used.
      <serviceCertificate>
        <certificateReference findValue="4FBBBA33A1D11A9022A5BF3492FF83320007686A" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
      </serviceCertificate>
      -->
    </federationConfiguration>
  </system.identityModel.services>

EsempioExample

Anche la durata del token dell'attestazione SAML rilasciato da AD FS deve essere impostato su 15 minuti, eseguendo il comando di PowerShell seguente nel server AD FS:Also the ADFS issued SAML claim token's lifetime should be set to 15 minutes, by executing the following powershell command on the ADFS server:

Set-ADFSRelyingPartyTrust -TargetName “<RelyingPartyWebApp>” -ClaimsProviderName @(“Active Directory”) -TokenLifetime 15 -AlwaysRequireAuthentication $true

Implementare la disconnessione appropriata dall'applicazioneImplement proper logout from the application

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps Eseguire la disconnessione appropriata dall'applicazione, quando l'utente fa clic sul pulsante di disconnessione.Perform proper Sign Out from the application, when user presses log out button. Durante la disconnessione, l'applicazione deve eliminare definitivamente la sessione dell'utente e anche reimpostare e rendere null il valore del cookie della sessione, oltre a reimpostare e rendere null il valore del cookie di autenticazione.Upon logout, application should destroy user's session, and also reset and nullify session cookie value, along with resetting and nullifying authentication cookie value. Quando più sessioni sono collegate a una singola identità utente, è anche necessario terminarle collettivamente sul lato server al momento del timeout o della disconnessione.Also, when multiple sessions are tied to a single user identity, they must be collectively terminated on the server side at timeout or logout. Assicurarsi infine che la funzionalità di disconnessione sia disponibile in ogni pagina.Lastly, ensure that Logout functionality is available on every page.

Mitigare il rischio di attacchi basati su richieste intersito false nelle API Web ASP.NETMitigate against Cross-Site Request Forgery (CSRF) attacks on ASP.NET Web APIs

TitoloTitle DettagliDetails
ComponenteComponent API WebWeb API
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps Richiesta intersito falsa (CSRF o XSRF) è un tipo di attacco in cui un utente malintenzionato può eseguire azioni nel contesto di protezione della sessione stabilita di un utente diverso in un sito web.Cross-site request forgery (CSRF or XSRF) is a type of attack in which an attacker can carry out actions in the security context of a different user's established session on a web site. L'obiettivo è quello di modificare o eliminare il contenuto, se il sito web di destinazione si affida esclusivamente ai cookie di sessione per autenticare la richiesta ricevuta.The goal is to modify or delete content, if the targeted web site relies exclusively on session cookies to authenticate received request. Un utente malintenzionato potrebbe sfruttare questa vulnerabilità acquisendo il browser di un altro utente per caricare un URL con un comando da un sito vulnerabile a cui l'utente è già connesso.An attacker could exploit this vulnerability by getting a different user's browser to load a URL with a command from a vulnerable site on which the user is already logged in. Un utente malintenzionato può raggiungere questo scopo in diversi modi, ad esempio ospitando un sito Web diverso che carica una risorsa dal server vulnerabile o spingendo l'utente a fare clic su un collegamento.There are many ways for an attacker to do that, such as by hosting a different web site that loads a resource from the vulnerable server, or getting the user to click a link. L'attacco può essere evitato se il server invia un token aggiuntivo al client, richiede al client di includere tale token in tutte le richieste future e verifica che tutte le richieste future includano un token relativo alla sessione corrente, ad esempio usando AntiForgeryToken o ViewState di ASP.NET.The attack can be prevented if the server sends an additional token to the client, requires the client to include that token in all future requests, and verifies that all future requests include a token that pertains to the current session, such as by using the ASP.NET AntiForgeryToken or ViewState.
TitoloTitle DettagliDetails
ComponenteComponent API WebWeb API
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies MVC 5, MVC 6MVC5, MVC6
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Preventing Cross-Site Request Forgery (CSRF) Attacks in ASP.NET Web API (Prevenzione di attacchi basati su richieste intersito false nelle API Web ASP.NET)Preventing Cross-Site Request Forgery (CSRF) Attacks in ASP.NET Web API
PassaggiSteps Prevenzione di richieste intersito false e AJAX: il token del form può rappresentare un problema per le richieste AJAX, perché una richiesta AJAX potrebbe inviare dati JSON, non dati in formato HTML.Anti-CSRF and AJAX: The form token can be a problem for AJAX requests, because an AJAX request might send JSON data, not HTML form data. Una soluzione consiste nell'inviare i token in un'intestazione HTTP personalizzata.One solution is to send the tokens in a custom HTTP header. Il codice seguente usa la sintassi Razor per generare i token e quindi li aggiunge a una richiesta AJAX.The following code uses Razor syntax to generate the tokens, and then adds the tokens to an AJAX request.

EsempioExample

<script>
    @functions{
        public string TokenHeaderValue()
        {
            string cookieToken, formToken;
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
            return cookieToken + ":" + formToken;                
        }
    }
    $.ajax("api/values", {
        type: "post",
        contentType: "application/json",
        data: {  }, // JSON data goes here
        dataType: "json",
        headers: {
            'RequestVerificationToken': '@TokenHeaderValue()'
        }
    });
</script>

EsempioExample

Quando si elabora la richiesta, estrarre i token dall'intestazione della richiesta.When you process the request, extract the tokens from the request header. Chiamare quindi il metodo AntiForgery.Validate per convalidare i token.Then call the AntiForgery.Validate method to validate the tokens. Il metodo Validate genera un'eccezione se i token non sono validi.The Validate method throws an exception if the tokens are not valid.

void ValidateRequestHeader(HttpRequestMessage request)
{
    string cookieToken = "";
    string formToken = "";

    IEnumerable<string> tokenHeaders;
    if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
    {
        string[] tokens = tokenHeaders.First().Split(':');
        if (tokens.Length == 2)
        {
            cookieToken = tokens[0].Trim();
            formToken = tokens[1].Trim();
        }
    }
    AntiForgery.Validate(cookieToken, formToken);
}

EsempioExample

Form ASP.NET MVC e contro le richieste intersito: usare il metodo helper AntiForgeryToken in Views. Inserire Html.AntiForgeryToken() nel form, ad esempio,Anti-CSRF and ASP.NET MVC forms - Use the AntiForgeryToken helper method on Views; put an Html.AntiForgeryToken() into the form, for example,

@using (Html.BeginForm("UserProfile", "SubmitUpdate")) { 
    @Html.ValidationSummary(true) 
    @Html.AntiForgeryToken()
    <fieldset> 
}

EsempioExample

Nell'esempio precedente verrà generato un output simile al seguente:The example above will output something like the following:

<form action="/UserProfile/SubmitUpdate" method="post">
    <input name="__RequestVerificationToken" type="hidden" value="saTFWpkKN0BYazFtN6c4YbZAmsEwG0srqlUqqloi/fVgeV2ciIFVmelvzwRZpArs" />
    <!-- rest of form goes here -->
</form>

EsempioExample

Html.AntiForgeryToken() assegna contemporaneamente al visitatore un cookie denominato __RequestVerificationToken, con lo stesso valore del valore nascosto casuale illustrato sopra.At the same time, Html.AntiForgeryToken() gives the visitor a cookie called __RequestVerificationToken, with the same value as the random hidden value shown above. Per convalidare un post del form in ingresso, aggiungere quindi il filtro [ValidateAntiForgeryToken] al metodo azione di destinazione.Next, to validate an incoming form post, add the [ValidateAntiForgeryToken] filter to the target action method. ad esempio:For example:

[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
// ... etc.
}

Filtro di autorizzazione che controlla che:Authorization filter that checks that:

  • La richiesta in ingresso abbia un cookie denominato __RequestVerificationToken.The incoming request has a cookie called __RequestVerificationToken
  • La richiesta in ingresso ha un cookie Request.Form denominato __RequestVerificationTokenThe incoming request has a Request.Form entry called __RequestVerificationToken
  • Questi valori del cookie e di Request.Form corrispondono. Presumendo che sia tutto a posto, la richiesta viene completata normalmente.These cookie and Request.Form values match Assuming all is well, the request goes through as normal. In caso contrario, si verifica un errore di autorizzazione e viene visualizzato il messaggio "Token antifalsificazione non specificato o non valido".But if not, then an authorization failure with message “A required anti-forgery token was not supplied or was invalid”.
TitoloTitle DettagliDetails
ComponenteComponent API WebWeb API
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies MVC 5, MVC 6MVC5, MVC6
Attributes (Attributi) (Attributi)Attributes Provider di identità: AD FS, provider di identità: Azure ADIdentity Provider - ADFS, Identity Provider - Azure AD
RiferimentiReferences Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2 (Proteggere un'API Web con account singoli e account di accesso locale in API Web ASP.NET 2.2)Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2
PassaggiSteps Se l'API Web viene protetta con OAuth 2.0, è previsto un token di connessione nell'intestazione della richiesta di autorizzazione e l'accesso alla richiesta viene concesso solo se il token è valido.If the Web API is secured using OAuth 2.0, then it expects a bearer token in Authorization request header and grants access to the request only if the token is valid. Diversamente dall'autenticazione basata su cookie, i browser non allegano i token di connessione alle richieste.Unlike cookie based authentication, browsers do not attach the bearer tokens to requests. Il client richiedente deve allegare esplicitamente il token di connessione nell'intestazione della richiesta.The requesting client needs to explicitly attach the bearer token in the request header. Per le API Web ASP.NET protette con OAuth 2.0, i token di connessione vengono quindi considerati una difesa contro gli attacchi basati su richieste intersito false.Therefore, for ASP.NET Web APIs protected using OAuth 2.0, bearer tokens are considered as a defense against CSRF attacks. Tenere presente che, se la parte MVC dell'applicazione usa l'autenticazione basata su form (ad esempio, usa i cookie), dall'app Web MVC devono essere usati token antifalsificazione.Please note that if the MVC portion of the application uses forms authentication (i.e., uses cookies), anti-forgery tokens have to be used by the MVC web app.

EsempioExample

All'API Web deve essere comunicato di basarsi SOLO sui token di connessione e non sui cookie.The Web API has to be informed to rely ONLY on bearer tokens and not on cookies. È possibile seguire la configurazione nel metodo WebApiConfig.Register: \`C-Sharp code config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));</span><span class="sxs-lookup"><span data-stu-id="d3ab3-495">It can be done by the following configuration in `WebApiConfig.Register` method:`C-Sharp code config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

The SuppressDefaultHostAuthentication method tells Web API to ignore any authentication that happens before the request reaches the Web API pipeline, either by IIS or by OWIN middleware. That way, we can restrict Web API to authenticate only using bearer tokens.