Marco de seguridad: Administración de sesionesSecurity Frame: Session Management

Producto o servicioProduct/Service ArtículoArticle
Azure ADAzure AD
Dispositivo IoTIoT Device
Azure Document DBAzure Document DB
ADFSADFS
Identity ServerIdentity Server
Aplicación webWeb Application
API webWeb API

Implemente el cierre de sesión correcto mediante métodos ADAL cuando use Azure ADImplement proper logout using ADAL methods when using Azure AD

TítuloTitle DetallesDetails
ComponenteComponent Azure ADAzure AD
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences N/DN/A
PasosSteps Si la aplicación se basa en el token de acceso emitido por Azure AD, el controlador de eventos de cierre de sesión debe realizar una llamada.If the application relies on access token issued by Azure AD, the logout event handler should call

EjemploExample

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

EjemploExample

También debe destruir la sesión del usuario llamando al método Session.Abandon().It should also destroy user's session by calling Session.Abandon() method. En el siguiente método, se muestra una implementación segura del cierre de sesión del usuario: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);
        } 

Use duraciones finitas para los tokens de SaS generadosUse finite lifetimes for generated SaS tokens

TítuloTitle DetallesDetails
ComponenteComponent Dispositivo IoTIoT Device
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences N/DN/A
PasosSteps Los tokens de SaS generados para la autenticación en Azure IoT Hub deben tener un período finito de expiración.SaS tokens generated for authenticating to Azure IoT Hub should have a finite expiry period. Mantenga las duraciones de los tokens de SaS en un mínimo para limitar el período de tiempo que se pueden reproducir en caso de que los tokens se vean en peligro.Keep the SaS token lifetimes to a minimum to limit the amount of time they can be replayed in case the tokens are compromised.

Use duraciones mínimas de token para los tokens de recursos generadosUse minimum token lifetimes for generated Resource tokens

TítuloTitle DetallesDetails
ComponenteComponent Azure DocumentDBAzure Document DB
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences N/DN/A
PasosSteps Reduzca el intervalo de tiempo del token de recurso a un valor mínimo necesario.Reduce the timespan of resource token to a minimum value required. Los tokens de recursos tienen un intervalo de tiempo válido predeterminado de 1 hora.Resource tokens have a default valid timespan of 1 hour.

Implemente el cierre de sesión correcto mediante métodos WsFederation cuando use ADFSImplement proper logout using WsFederation methods when using ADFS

TítuloTitle DetallesDetails
ComponenteComponent ADFSADFS
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences N/DN/A
PasosSteps Si la aplicación se basa en un token de STS emitido por ADFS, el controlador de eventos de cierre de sesión debe llamar al método WSFederationAuthenticationModule.FederatedSignOut() para cerrar la sesión del usuario.If the application relies on STS token issued by ADFS, the logout event handler should call WSFederationAuthenticationModule.FederatedSignOut() method to log out the user. Además, se debe destruir la sesión actual, y se debe restablecer y anular el valor del token de sesión.Also the current session should be destroyed, and the session token value should be reset and nullified.

EjemploExample

        [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);
        }

Implemente el cierre de sesión correcto cuando use Identity ServerImplement proper logout when using Identity Server

TítuloTitle DetallesDetails
ComponenteComponent Identity ServerIdentity Server
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences IdentityServer3-Federated Signout (Cierre de sesión federado en IdentityServer3)IdentityServer3-Federated sign out
PasosSteps IdentityServer admite la capacidad de federación con proveedores de identidades externos.IdentityServer supports the ability to federate with external identity providers. Cuando un usuario cierra sesión en un proveedor de identidades precedente, según el protocolo que se use, podría ser posible recibir una notificación cuando el usuario cierre la sesión. Esto permite, a su vez, que IdentityServer notifique a sus clientes para que también cierren la sesión del usuario. Consulte la documentación en la sección Referencias para ver los detalles de la implementación.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.

Las aplicaciones disponibles a través de HTTPS deben usar cookies segurasApplications available over HTTPS must use secure cookies

TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferenciasReferences httpCookies (Elemento, Esquema de configuración de ASP.NET), Propiedad HttpCookie.SecurehttpCookies Element (ASP.NET Settings Schema), HttpCookie.Secure Property
PasosSteps Normalmente, las cookies solo son accesibles para el dominio a cuyo ámbito se limitaron.Cookies are normally only accessible to the domain for which they were scoped. Lamentablemente, la definición de "dominio" no incluye el protocolo, así que las cookies que se crean a través de HTTPS son accesibles a través de HTTP.Unfortunately, the definition of "domain" does not include the protocol so cookies that are created over HTTPS are accessible over HTTP. El atributo "secure" indica al explorador que la cookie solo debe estar disponible a través de HTTPS.The "secure" attribute indicates to the browser that the cookie should only be made available over HTTPS. Asegúrese de que todas las cookies establecidas a través de HTTPS usen el atributo secure.Ensure that all cookies set over HTTPS use the secure attribute. Para aplicar el requisito en el archivo Web.config, establezca el atributo requireSSL en true.The requirement can be enforced in the web.config file by setting the requireSSL attribute to true. Se trata del método preferido porque aplicará el atributo secure para todas las cookies actuales y futuras sin necesidad de que se realice ningún otro cambio en el código.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.

EjemploExample

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

La configuración se aplica incluso si se usa HTTP para tener acceso a la aplicación.The setting is enforced even if HTTP is used to access the application. Si se utiliza HTTP para tener acceso a la aplicación, la configuración la interrumpe porque las cookies están establecidas con el atributo secure y el explorador no las enviará de vuelta a la aplicación.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.

TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies Formularios Web Forms, MVC5Web Forms, MVC5
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferenciasReferences N/DN/A
PasosSteps Cuando la aplicación web es el usuario de confianza y el proveedor de identidades es el servidor AD FS, se puede configurar el atributo secure del token FedAuth estableciendo requireSSL en True en la sección system.identityModel.services del archivo 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:

EjemploExample

  <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>
TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences Atributo de cookie seguraSecure Cookie Attribute
PasosSteps Para mitigar el riesgo de divulgación de información por un ataque de scripting entre sitios (XSS), se incorporó un nuevo atributo (httpOnly) a las cookies, el cual es compatible con todos los exploradores principales.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. El atributo especifica que una cookie no es accesible a través de un script.The attribute specifies that a cookie is not accessible through script. Al usar cookies HttpOnly, una aplicación web reduce la posibilidad de que se robe mediante un script la información confidencial contenida en la cookie y se envíe al sitio web de un atacante.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.

EjemploExample

Todas las aplicaciones basadas en HTTP que usen cookies deben especificar HttpOnly en la definición de la cookie; para ello, se debe implementar la siguiente configuración en el archivo 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>
TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies Formularios Web FormsWeb Forms
AtributosAttributes N/DN/A
ReferenciasReferences Propiedad FormsAuthentication.RequireSSLFormsAuthentication.RequireSSL Property
PasosSteps El valor de la propiedad RequireSSL se establece en el archivo de configuración para una aplicación ASP.NET mediante el atributo requireSSL del elemento de configuración.The RequireSSL property value is set in the configuration file for an ASP.NET application by using the requireSSL attribute of the configuration element. Puede especificar en el archivo Web.config de la aplicación ASP.NET si se requiere Seguridad de la capa de transporte (TLS), conocido anteriormente como SSL (Capa de sockets seguros), para devolver la cookie de autenticación de formularios al servidor estableciendo el atributo requireSSL.You can specify in the Web.config file for your ASP.NET application whether Transport Layer Security (TLS), previously known as SSL (Secure Sockets Layer), is required to return the forms-authentication cookie to the server by setting the requireSSL attribute.

EjemploExample

En el ejemplo de código siguiente, se establece el atributo requireSSL en el archivo 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>
TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies MVC5MVC5
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferenciasReferences Windows Identity Foundation (WIF) Configuration – Part II (Configuración de Windows Identity Foundation: parte II)Windows Identity Foundation (WIF) Configuration – Part II
PasosSteps Para establecer el atributo httpOnly para las cookies FedAuth, el valor del atributo hideFromScript se debe establecer en True.To set httpOnly attribute for FedAuth cookies, hideFromCsript attribute value should be set to True.

EjemploExample

En el siguiente ejemplo se muestra la configuración correcta:Following configuration shows the correct configuration:

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

Mitigue el riesgo de ataques de falsificación de solicitud entre sitios (CSRF) en páginas web ASP.NETMitigate against Cross-Site Request Forgery (CSRF) attacks on ASP.NET web pages

TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences N/DN/A
PasosSteps La falsificación de solicitud entre sitios (CSRF o XSRF) es un tipo de ataque en el que un atacante puede llevar a cabo acciones en el contexto de seguridad de una sesión establecida de un usuario diferente en un sitio 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. El objetivo es modificar o eliminar contenido, si el sitio web de destino confía exclusivamente en cookies de sesión para autenticar la solicitud recibida.The goal is to modify or delete content, if the targeted web site relies exclusively on session cookies to authenticate received request. Un atacante podría aprovechar esta vulnerabilidad y hacer que el explorador de un usuario diferente cargue una dirección URL con un comando procedente de un sitio vulnerable en el que el usuario ya haya iniciado sesión.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. Hay muchas maneras de hacerlo, como hospedar un sitio web diferente que carga un recurso desde el servidor vulnerable o conseguir que el usuario haga clic en un vínculo.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. El ataque se puede evitar si el servidor envía un token adicional al cliente, requiere que el cliente lo incluya en todas las solicitudes futuras y comprueba que todas las solicitudes futuras incluyan un token asociado a la sesión actual, como con los métodos AntiForgeryToken o ViewState de 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.
TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies MVC5, MVC6MVC5, MVC6
AtributosAttributes N/DN/A
ReferenciasReferences XSRF/CSRF Prevention in ASP.NET MVC and Web Pages (Prevención de XSRF y CSRF en ASP.NET MVC y Web Pages)XSRF/CSRF Prevention in ASP.NET MVC and Web Pages
PasosSteps En formularios anti-CSRF y de ASP.NET MVC: use el método del asistente AntiForgeryToken en vistas; incluya un elemento Html.AntiForgeryToken() en el formulario, como en el siguiente ejemplo.Anti-CSRF and ASP.NET MVC forms - Use the AntiForgeryToken helper method on Views; put an Html.AntiForgeryToken() into the form, for example,

EjemploExample

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

EjemploExample

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

EjemploExample

Al mismo tiempo, Html.AntiForgeryToken() proporciona al visitante una cookie denominada __RequestVerificationToken, con el mismo valor que el valor aleatorio de hidden mostrado arriba.At the same time, Html.AntiForgeryToken() gives the visitor a cookie called __RequestVerificationToken, with the same value as the random hidden value shown above. A continuación, para validar un envío de formulario entrante, agregue el filtro [ValidateAntiForgeryToken] al método de acción de destino.Next, to validate an incoming form post, add the [ValidateAntiForgeryToken] filter to the target action method. Por ejemplo:For example:

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

Filtro de autorización que comprueba que:Authorization filter that checks that:

  • La solicitud entrante tenga una cookie denominada __RequestVerificationToken;The incoming request has a cookie called __RequestVerificationToken
  • La solicitud entrante tenga una entrada Request.Form denominada __RequestVerificationToken;The incoming request has a Request.Form entry called __RequestVerificationToken
  • Estos valores de cookie y Request.Form coincidan. Suponiendo que todo sea correcto, la solicitud entra de la forma normal.These cookie and Request.Form values match Assuming all is well, the request goes through as normal. De lo contrario, aparece un error de autorización con el mensaje "No se especificó un token antifalsificación o el que se especificó no era válido".But if not, then an authorization failure with message “A required anti-forgery token was not supplied or was invalid”.

EjemploExample

Anti-CSRF y AJAX: el token de formulario puede ser un problema para las solicitudes AJAX, porque estas podrían enviar datos JSON en lugar de datos de formulario 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 solución consiste en enviar los tokens en un encabezado HTTP personalizado.One solution is to send the tokens in a custom HTTP header. En el código siguiente, se utiliza sintaxis de Razor para generar los tokens, que después se agregan a una solicitud 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>

EjemploExample

Cuando procese la solicitud, extraiga los tokens del encabezado de la solicitud.When you process the request, extract the tokens from the request header. Después, llame al método AntiForgery.Validate para validar los tokens.Then call the AntiForgery.Validate method to validate the tokens. El método Validate produce una excepción si los tokens no son válidos.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);
}
TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies Formularios Web FormsWeb Forms
AtributosAttributes N/DN/A
ReferenciasReferences Cómo aprovechar las ventajas de las características integradas de ASP.NET para rechazar los ataques a través de InternetTake Advantage of ASP.NET Built-in Features to Fend Off Web Attacks
PasosSteps Los ataques CSRF en aplicaciones basadas en formularios Web Forms se pueden mitigar si se establece ViewStateUserKey en una cadena aleatoria que varíe para cada usuario, como el id. de usuario o, mejor aún, el identificador de sesión.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. Por diversas razones técnicas y sociales, el id. de sesión es mucho más adecuado porque es imprevisible, agota el tiempo de espera y varía para cada usuario.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.

EjemploExample

Este es el código que debe tener en todas las páginas:Here's the code you need to have in all of your pages:

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

Configure la sesión para la duración de la inactividadSet up session for inactivity lifetime

TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences Propiedad HttpSessionState.TimeoutHttpSessionState.Timeout Property
PasosSteps El tiempo de espera de la sesión representa el evento que se produce cuando un usuario no realiza ninguna acción en un sitio web durante un intervalo (definido por el servidor web).Session timeout represents the event occurring when a user does not perform any action on a web site during an interval (defined by web server). El evento, en el lado servidor, cambia el estado de la sesión del usuario a "invalid" (por ejemplo, "ya no se usa") e indica al servidor web que lo destruirá (y eliminará todos los datos que contiene).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). En el ejemplo de código siguiente, se establece el atributo de sesión de tiempo de espera en 15 minutos en el archivo Web.config.The following code example sets the timeout session attribute to 15 minutes in the Web.config file.

EjemploExample

<configuration>
  <system.web>
    <sessionState mode="InProc" cookieless="true" timeout="15" />
  </system.web>
</configuration>

Habilitamiento de la detección de amenazas en Azure SQLEnable Threat detection on Azure SQL

TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies Formularios Web FormsWeb Forms
AtributosAttributes N/DN/A
ReferenciasReferences Elemento forms para authentication (Esquema de configuración de ASP.NET)Forms element for authentication (ASP.NET Settings Schema)
PasosSteps Establezca el tiempo de espera de la cookie para el vale de autenticación de formularios en 15 minutos.Set the Forms Authentication Ticket cookie timeout to 15 minutes

EjemploExample

<forms  name=".ASPXAUTH" loginUrl="login.aspx"  defaultUrl="default.aspx" protection="All" timeout="15" path="/" requireSSL="true" slidingExpiration="true"/>
</forms>
TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies Formularios Web Forms, MVC5Web Forms, MVC5
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferenciasReferences asdeqaasdeqa
PasosSteps Cuando la aplicación web es Usuario de confianza y ADFS es el STS, la duración de las cookies de autenticación (tokens de FedAuth) se puede establecer mediante la siguiente configuración en web.config: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:

EjemploExample

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

EjemploExample

Además, la duración del token de notificación SAML emitido por ADFS se debe establecer en 15 minutos ejecutando el siguiente comando de PowerShell en el servidor de 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

Implemente el cierre de sesión correcto desde la aplicaciónImplement proper logout from the application

TítuloTitle DetallesDetails
ComponenteComponent Aplicación webWeb Application
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences N/DN/A
PasosSteps Realice el cierre de sesión correctamente desde la aplicación, cuando el usuario presione el botón de cierre de sesión.Perform proper Sign Out from the application, when user presses log out button. Al cerrar la sesión, la aplicación debe destruir la sesión del usuario y también restablecer y anular el valor de la cookie de la sesión, así como restablecer y anular el valor de la cookie de autenticación.Upon logout, application should destroy user's session, and also reset and nullify session cookie value, along with resetting and nullifying authentication cookie value. Además, cuando hay varias sesiones asociadas a una sola identidad de usuario, se deben finalizar colectivamente en el lado servidor cuando se agote el tiempo de espera o se produzca el cierre de sesión.Also, when multiple sessions are tied to a single user identity, they must be collectively terminated on the server side at timeout or logout. Por último, asegúrese de que la funcionalidad de cierre de sesión esté disponible en todas las páginas.Lastly, ensure that Logout functionality is available on every page.

Mitigue el riesgo de ataques de falsificación de solicitud entre sitios (CSRF) en las API web de ASP.NETMitigate against Cross-Site Request Forgery (CSRF) attacks on ASP.NET Web APIs

TítuloTitle DetallesDetails
ComponenteComponent API WebWeb API
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies GenéricoGeneric
AtributosAttributes N/DN/A
ReferenciasReferences N/DN/A
PasosSteps La falsificación de solicitud entre sitios (CSRF o XSRF) es un tipo de ataque en el que un atacante puede llevar a cabo acciones en el contexto de seguridad de una sesión establecida de un usuario diferente en un sitio 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. El objetivo es modificar o eliminar contenido, si el sitio web de destino confía exclusivamente en cookies de sesión para autenticar la solicitud recibida.The goal is to modify or delete content, if the targeted web site relies exclusively on session cookies to authenticate received request. Un atacante podría aprovechar esta vulnerabilidad y hacer que el explorador de un usuario diferente cargue una dirección URL con un comando procedente de un sitio vulnerable en el que el usuario ya haya iniciado sesión.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. Hay muchas maneras de hacerlo, como hospedar un sitio web diferente que carga un recurso desde el servidor vulnerable o conseguir que el usuario haga clic en un vínculo.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. El ataque se puede evitar si el servidor envía un token adicional al cliente, requiere que el cliente lo incluya en todas las solicitudes futuras y comprueba que todas las solicitudes futuras incluyan un token asociado a la sesión actual, como con los métodos AntiForgeryToken o ViewState de 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.
TítuloTitle DetallesDetails
ComponenteComponent API WebWeb API
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies MVC5, MVC6MVC5, MVC6
AtributosAttributes N/DN/A
ReferenciasReferences Preventing Cross-Site Request Forgery (CSRF) Attacks in ASP.NET Web API (Prevención de ataques de falsificación de solicitud entre sitios [CSRF] en ASP.NET Web API)Preventing Cross-Site Request Forgery (CSRF) Attacks in ASP.NET Web API
PasosSteps Anti-CSRF y AJAX: el token de formulario puede ser un problema para las solicitudes AJAX, porque estas podrían enviar datos JSON en lugar de datos de formulario 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 solución consiste en enviar los tokens en un encabezado HTTP personalizado.One solution is to send the tokens in a custom HTTP header. En el código siguiente, se utiliza sintaxis de Razor para generar los tokens, que después se agregan a una solicitud AJAX.The following code uses Razor syntax to generate the tokens, and then adds the tokens to an AJAX request.

EjemploExample

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

EjemploExample

Cuando procese la solicitud, extraiga los tokens del encabezado de la solicitud.When you process the request, extract the tokens from the request header. Después, llame al método AntiForgery.Validate para validar los tokens.Then call the AntiForgery.Validate method to validate the tokens. El método Validate produce una excepción si los tokens no son válidos.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);
}

EjemploExample

En formularios anti-CSRF y de ASP.NET MVC: use método del asistente AntiForgeryToken en vistas; incluya un elemento Html.AntiForgeryToken() en el formulario, como en el siguiente ejemplo.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> 
}

EjemploExample

La salida se parecerá a lo siguiente: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>

EjemploExample

Al mismo tiempo, Html.AntiForgeryToken() proporciona al visitante una cookie denominada __RequestVerificationToken, con el mismo valor que el valor aleatorio de hidden mostrado arriba.At the same time, Html.AntiForgeryToken() gives the visitor a cookie called __RequestVerificationToken, with the same value as the random hidden value shown above. A continuación, para validar un envío de formulario entrante, agregue el filtro [ValidateAntiForgeryToken] al método de acción de destino.Next, to validate an incoming form post, add the [ValidateAntiForgeryToken] filter to the target action method. Por ejemplo:For example:

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

Filtro de autorización que comprueba que:Authorization filter that checks that:

  • La solicitud entrante tenga una cookie denominada __RequestVerificationToken;The incoming request has a cookie called __RequestVerificationToken
  • La solicitud entrante tenga una entrada Request.Form denominada __RequestVerificationToken;The incoming request has a Request.Form entry called __RequestVerificationToken
  • Estos valores de cookie y Request.Form coincidan. Suponiendo que todo sea correcto, la solicitud entra de la forma normal.These cookie and Request.Form values match Assuming all is well, the request goes through as normal. De lo contrario, aparece un error de autorización con el mensaje "No se especificó un token antifalsificación o el que se especificó no era válido".But if not, then an authorization failure with message “A required anti-forgery token was not supplied or was invalid”.
TítuloTitle DetallesDetails
ComponenteComponent API WebWeb API
Fase de SDLSDL Phase BuildBuild
Tecnologías aplicablesApplicable Technologies MVC5, MVC6MVC5, MVC6
AtributosAttributes Proveedor de identidades; ADFS, Proveedor de identidades; Azure ADIdentity Provider - ADFS, Identity Provider - Azure AD
ReferenciasReferences Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2 (Protección de una API web con cuentas individuales e inicio de sesión local en ASP.NET Web API 2.2)Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2
PasosSteps Si la API web se protege con OAuth 2.0, espera un token de portador en el encabezado de solicitud de autorización y concede acceso a la solicitud solo si el token es válido.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. A diferencia de la autenticación basada en cookies, los exploradores no adjuntan los tokens de portador a las solicitudes.Unlike cookie based authentication, browsers do not attach the bearer tokens to requests. El cliente solicitante debe adjuntar explícitamente el token de portador al encabezado de solicitud.The requesting client needs to explicitly attach the bearer token in the request header. Por lo tanto, para las API web de ASP.NET protegidas con OAuth 2.0, los tokens de portador se consideran una defensa contra los ataques CSRF.Therefore, for ASP.NET Web APIs protected using OAuth 2.0, bearer tokens are considered as a defense against CSRF attacks. Tenga en cuenta que, si la parte MVC de la aplicación utiliza la autenticación de formularios (es decir, usa cookies), la aplicación web de MVC debe usar tokens antifalsificación.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.

EjemploExample

Se ha de informar a la API web de que solo debe confiar en tokens de portador y no en cookies.The Web API has to be informed to rely ONLY on bearer tokens and not on cookies. Se puede realizar mediante la siguiente configuración en el método WebApiConfig.Register:It can be done by the following configuration in WebApiConfig.Register method:

config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

El método SuppressDefaultHostAuthentication indica a API Web que ignore toda autenticación que se produzca antes de que la solicitud llegue a la canalización de API Web, ya sea mediante IIS o middleware de OWIN.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. De este modo, se puede restringir API Web para la autenticación solo con tokens de portador.That way, we can restrict Web API to authenticate only using bearer tokens.