Quadro de Segurança: Gestão de SessãoSecurity Frame: Session Management

Produto/ServiçoProduct/Service ArtigoArticle
Azure ADAzure AD
Dispositivo IoTIoT Device
Documento Azure DBAzure Document DB
ADFSADFS
Servidor de IdentidadeIdentity Server
Aplicação WebWeb Application
API WebWeb API

Implemente o logout adequado utilizando métodos ADAL ao utilizar o Azure ADImplement proper logout using ADAL methods when using Azure AD

TítuloTitle DetalhesDetails
ComponenteComponent Azure ADAzure AD
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences N/DN/A
PassosSteps Se a aplicação depender do token de acesso emitido pela Azure AD, o manipulador de eventos logout deve ligarIf the application relies on access token issued by Azure AD, the logout event handler should call

ExemploExample

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

ExemploExample

Também deve destruir a sessão do utilizador chamando o método Session.Abandon().It should also destroy user's session by calling Session.Abandon() method. O método seguinte mostra uma implementação segura do logout do utilizador: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 vidas finitas para tokens SaS geradosUse finite lifetimes for generated SaS tokens

TítuloTitle DetalhesDetails
ComponenteComponent Dispositivo IoTIoT Device
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences N/DN/A
PassosSteps Os tokens SaS gerados para autenticação no Azure IoT Hub devem ter um período de validade finito.SaS tokens generated for authenticating to Azure IoT Hub should have a finite expiry period. Mantenha as vidas de símbolo sas ao mínimo para limitar o tempo que podem ser reproduzidos no caso de as fichas estarem comprometidas.Keep the SaS token lifetimes to a minimum to limit the amount of time they can be replayed in case the tokens are compromised.

Utilize as vidas mínimas simbólicas para tokens de recursos geradosUse minimum token lifetimes for generated Resource tokens

TítuloTitle DetalhesDetails
ComponenteComponent Documento Azure DBAzure Document DB
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences N/DN/A
PassosSteps Reduza o tempo de token de recurso para um valor mínimo necessário.Reduce the timespan of resource token to a minimum value required. As fichas de recursos têm um tempo de tempo válido de 1 hora.Resource tokens have a default valid timespan of 1 hour.

Implementar o logout adequado utilizando métodos de WsFederation ao utilizar o ADFSImplement proper logout using WsFederation methods when using ADFS

TítuloTitle DetalhesDetails
ComponenteComponent ADFSADFS
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences N/DN/A
PassosSteps Se a aplicação depender do token STS emitido pela ADFS, o manipulador de eventos logout deve ligar para o método WSFederationAuthenticationModule.FederatedSignOut() para registar o utilizador.If the application relies on STS token issued by ADFS, the logout event handler should call WSFederationAuthenticationModule.FederatedSignOut() method to log out the user. Também a sessão atual deve ser destruída, e o valor simbólico da sessão deve ser reposto e anulado.Also the current session should be destroyed, and the session token value should be reset and nullified.

ExemploExample

        [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 o logout adequado ao utilizar o Servidor de IdentidadeImplement proper logout when using Identity Server

TítuloTitle DetalhesDetails
ComponenteComponent Servidor de IdentidadeIdentity Server
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences Assinatura IdentitáriaServer3-FederadaIdentityServer3-Federated sign out
PassosSteps O IdentityServer apoia a capacidade de federação com fornecedores de identidade externos.IdentityServer supports the ability to federate with external identity providers. Quando um utilizador assina fora de um fornecedor de identidade a montante, dependendo do protocolo utilizado, pode ser possível receber uma notificação quando o utilizador assinar. Permite que o IdentityServer notifique os seus clientes para que também possam assinar o utilizador. Consulte a documentação na secção de referências para obter os detalhes da implementação.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.

As aplicações disponíveis em HTTPS devem utilizar cookies segurosApplications available over HTTPS must use secure cookies

TítuloTitle DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferênciasReferences httpCookies Element (ASP.NET Definições Schema), HttpCookie.Secure PropertyhttpCookies Element (ASP.NET Settings Schema), HttpCookie.Secure Property
PassosSteps Normalmente, os cookies só são acessíveis ao domínio para o qual foram examinados.Cookies are normally only accessible to the domain for which they were scoped. Infelizmente, a definição de "domínio" não inclui o protocolo para que os cookies que são criados em HTTPS estejam acessíveis em HTTPS.Unfortunately, the definition of "domain" does not include the protocol so cookies that are created over HTTPS are accessible over HTTP. O atributo "seguro" indica ao navegador que o cookie só deve ser disponibilizado através do HTTPS.The "secure" attribute indicates to the browser that the cookie should only be made available over HTTPS. Certifique-se de que todos os cookies definidos em HTTPS utilizem o atributo secure.Ensure that all cookies set over HTTPS use the secure attribute. A exigência pode ser aplicada no ficheiro web.config, definindo o atributo requereSSL à verdadeira.The requirement can be enforced in the web.config file by setting the requireSSL attribute to true. É a abordagem preferida porque irá impor o atributo seguro para todos os cookies atuais e futuros sem a necessidade de fazer quaisquer alterações adicionais de 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.

ExemploExample

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

A definição é aplicada mesmo que HTTP seja utilizado para aceder à aplicação.The setting is enforced even if HTTP is used to access the application. Se HTTP for utilizado para aceder à aplicação, a configuração quebra a aplicação porque os cookies são definidos com o atributo seguro e o navegador não os enviará de volta para a aplicação.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 DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies Formulários Web, MVC5Web Forms, MVC5
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferênciasReferences N/DN/A
PassosSteps Quando a aplicação web é a Parte De Gestão, e o IdP é servidor ADFS, o atributo seguro do token da FedAuth pode ser configurado por definição requerSSL a True na system.identityModel.services secção de 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:

ExemploExample

  <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 DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences Atributo de cookies segurosSecure Cookie Attribute
PassosSteps Para mitigar o risco de divulgação de informação com um ataque de scripts cross-site (XSS), um novo atributo - httpOnly - foi introduzido nos cookies e é suportado por todos os principais navegadores.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. O atributo especifica que um cookie não é acessível através do script.The attribute specifies that a cookie is not accessible through script. Ao utilizar cookies HttpOnly, uma aplicação web reduz a possibilidade de que informações sensíveis contidas no cookie possam ser roubadas através do script e enviadas para o site de um intruso.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.

ExemploExample

Todas as aplicações baseadas em HTTP que utilizam cookies devem especificar httpOnly na definição de cookies, implementando a seguinte configuração em 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 DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies Formulários WebWeb Forms
AtributosAttributes N/DN/A
ReferênciasReferences FormuláriosAufercation.requer propriedade de SlFormsAuthentication.RequireSSL Property
PassosSteps O valor da propriedade RequireSSL é definido no ficheiro de configuração para uma aplicação ASP.NET utilizando o atributo requereSSL do elemento de configuração.The RequireSSL property value is set in the configuration file for an ASP.NET application by using the requireSSL attribute of the configuration element. Pode especificar no ficheiro Web.config para a sua aplicação ASP.NET se a Segurança da Camada de Transporte (TLS), anteriormente conhecida como SSL (Camada de Tomadas Seguras), é necessária para devolver o cookie de autenticação de formulários ao servidor, definindo o atributo requerendoSSL.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.

ExemploExample

O exemplo de código a seguir define o atributo requereSSL no ficheiro 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 DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies MVC5MVC5
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferênciasReferences Configuração da Fundação da Identidade do Windows (WIF) – Parte IIWindows Identity Foundation (WIF) Configuration – Part II
PassosSteps Para definir httpOn atribua para cookies FedAuth, o valor de atributo HideFromCsript deve ser definido para True.To set httpOnly attribute for FedAuth cookies, hideFromCsript attribute value should be set to True.

ExemploExample

A configuração seguinte mostra a configuração correta:Following configuration shows the correct configuration:

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

Mitigar contra ataques de falsificação de pedidos de cross-site (CSRF) em páginas web ASP.NETMitigate against Cross-Site Request Forgery (CSRF) attacks on ASP.NET web pages

TítuloTitle DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences N/DN/A
PassosSteps Falsificação de pedidos de sites (CSRF ou XSRF) é um tipo de ataque no qual um intruso pode realizar ações no contexto de segurança de uma sessão estabelecida de um utilizador diferente num site.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. O objetivo é modificar ou eliminar conteúdo, se o site direcionado se basear exclusivamente em cookies de sessão para autenticar o pedido recebido.The goal is to modify or delete content, if the targeted web site relies exclusively on session cookies to authenticate received request. Um intruso poderia explorar esta vulnerabilidade obtendo um navegador de um utilizador diferente para carregar um URL com um comando a partir de um site vulnerável no qual o utilizador já está iniciado.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. Existem muitas formas de um intruso fazer isso, como por exemplo hospedar um site diferente que carrega um recurso a partir do servidor vulnerável, ou fazer com que o utilizador clique num link.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. O ataque pode ser evitado se o servidor enviar um sinal adicional ao cliente, requer que o cliente inclua esse token em todos os pedidos futuros, e verifique que todos os pedidos futuros incluem um token que se refere à sessão atual, como por exemplo, utilizando o ASP.NET AntiForgeryToken ou ViewState.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 DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies MVC5, MVC6MVC5, MVC6
AtributosAttributes N/DN/A
ReferênciasReferences Prevenção XSRF/CSRF em ASP.NET MVC e Páginas WebXSRF/CSRF Prevention in ASP.NET MVC and Web Pages
PassosSteps Formulários anti-CSRF e ASP.NET MVC - Utilize o AntiForgeryToken método de ajuda em Vistas; coloque um no Html.AntiForgeryToken() formulário, por exemplo,Anti-CSRF and ASP.NET MVC forms - Use the AntiForgeryToken helper method on Views; put an Html.AntiForgeryToken() into the form, for example,

ExemploExample

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

ExemploExample

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

ExemploExample

Ao mesmo tempo, html.AntiForgeryToken() dá ao visitante um cookie chamado __RequestVerificationToken, com o mesmo valor que o valor escondido aleatório acima indicado.At the same time, Html.AntiForgeryToken() gives the visitor a cookie called __RequestVerificationToken, with the same value as the random hidden value shown above. Em seguida, para validar um post de formulário de entrada, adicione o filtro [ValidateAntiForgeryToken] ao método de ação alvo.Next, to validate an incoming form post, add the [ValidateAntiForgeryToken] filter to the target action method. Por exemplo:For example:

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

Filtro de autorização que verifica:Authorization filter that checks that:

  • O pedido de entrada tem um cookie chamado __RequestVerificationTokenThe incoming request has a cookie called __RequestVerificationToken
  • O pedido de entrada tem uma Request.Form entrada chamada __RequestVerificationTokenThe incoming request has a Request.Form entry called __RequestVerificationToken
  • Estes cookies e Request.Form valores correspondem Assumindo que está tudo bem, o pedido passa normalmente.These cookie and Request.Form values match Assuming all is well, the request goes through as normal. Mas se não, então uma falha de autorização com mensagem "Um sinal anti-falsificação exigido não foi fornecido ou foi inválido".But if not, then an authorization failure with message “A required anti-forgery token was not supplied or was invalid”.

ExemploExample

Anti-CSRF e AJAX: O token do formulário pode ser um problema para os pedidos do AJAX, porque um pedido do AJAX pode enviar dados de JSON, não dados de formulário 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. Uma solução é enviar os tokens num cabeçalho HTTP personalizado.One solution is to send the tokens in a custom HTTP header. O código seguinte utiliza a sintaxe Razor para gerar os tokens e, em seguida, adiciona os tokens a um pedido do 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>

ExemploExample

Quando processar o pedido, extraia as fichas do cabeçalho do pedido.When you process the request, extract the tokens from the request header. Em seguida, ligue para o método AntiForgery.Validate para validar os tokens.Then call the AntiForgery.Validate method to validate the tokens. O método Valide abre uma exceção se as fichas não forem válidas.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 DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies Formulários WebWeb Forms
AtributosAttributes N/DN/A
ReferênciasReferences Aproveite ASP.NET funcionalidades incorporadas para evitar ataques webTake Advantage of ASP.NET Built-in Features to Fend Off Web Attacks
PassosSteps Os ataques CSRF em aplicações baseadas no WebForm podem ser atenuados definindo o ViewStateUserKey para uma cadeia aleatória que varia para cada utilizador - ID do utilizador ou, melhor ainda, ID de sessão.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 uma série de razões técnicas e sociais, o ID da sessão é muito melhor porque um ID de sessão é imprevisível, horários e varia por utilizador.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.

ExemploExample

Aqui está o código que precisa de ter em todas as suas 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;
   :
}

Preparar sessão para a vida útil da inatividadeSet up session for inactivity lifetime

TítuloTitle DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences HttpSessionState.Timeout PropertyHttpSessionState.Timeout Property
PassosSteps O tempo limite de sessão representa o evento que ocorre quando um utilizador não realiza qualquer ação num web site durante um intervalo (definido pelo 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). O evento, do lado do servidor, altera o estado da sessão de utilizador para 'inválido' (por exemplo, "já não é utilizado") e instrui o servidor web a destruí-lo (eliminando todos os dados nele contidos).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). O exemplo de código a seguir define o atributo de sessão de tempo limite para 15 minutos no ficheiro Web.config.The following code example sets the timeout session attribute to 15 minutes in the Web.config file.

ExemploExample

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

Ativar a deteção de ameaças no Azure SQLEnable Threat detection on Azure SQL

TítuloTitle DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies Formulários WebWeb Forms
AtributosAttributes N/DN/A
ReferênciasReferences Formulários elemento para autenticação (ASP.NET Esquema de Definições)Forms element for authentication (ASP.NET Settings Schema)
PassosSteps Desa quando definir o tempo limite de cookies de autenticação de formulários para 15 minutosSet the Forms Authentication Ticket cookie timeout to 15 minutes

ExemploExample

<forms  name=".ASPXAUTH" loginUrl="login.aspx"  defaultUrl="default.aspx" protection="All" timeout="15" path="/" requireSSL="true" slidingExpiration="true"/>
</forms>
TítuloTitle DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies Formulários Web, MVC5Web Forms, MVC5
AtributosAttributes EnvironmentType - OnPremEnvironmentType - OnPrem
ReferênciasReferences asdeqaasdeqa
PassosSteps Quando a aplicação web é Relying Party e ADFS é o STS, o tempo de vida útil dos cookies de autenticação - fichas FedAuth - pode ser definido pela seguinte configuração em 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:

ExemploExample

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

ExemploExample

Também o ADFS emitiu a alegação de que o token deve ser definido para 15 minutos, executando o seguinte comando de powershell no servidor ADFS: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

Implementar o logout adequado a partir da aplicaçãoImplement proper logout from the application

TítuloTitle DetalhesDetails
ComponenteComponent Aplicação WebWeb Application
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences N/DN/A
PassosSteps Execute a assinatura adequada da aplicação, quando o utilizador premir o botão 'iniciar sessão'.Perform proper Sign Out from the application, when user presses log out button. Após o logout, a aplicação deve destruir a sessão do utilizador e também redefinir e anular o valor dos cookies da sessão, juntamente com a reposição e anulação do valor dos cookies de autenticação.Upon logout, application should destroy user's session, and also reset and nullify session cookie value, along with resetting and nullifying authentication cookie value. Além disso, quando várias sessões estão ligadas a uma única identidade de utilizador, devem ser encerradas coletivamente no lado do servidor no tempo limite ou logout.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, certifique-se de que a funcionalidade Logout está disponível em todas as páginas.Lastly, ensure that Logout functionality is available on every page.

Mitigar contra ataques de falsificação de pedidos de cross-site (CSRF) em APIs web ASP.NETMitigate against Cross-Site Request Forgery (CSRF) attacks on ASP.NET Web APIs

TítuloTitle DetalhesDetails
ComponenteComponent API WebWeb API
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies GenéricaGeneric
AtributosAttributes N/DN/A
ReferênciasReferences N/DN/A
PassosSteps Falsificação de pedidos de sites (CSRF ou XSRF) é um tipo de ataque no qual um intruso pode realizar ações no contexto de segurança de uma sessão estabelecida de um utilizador diferente num site.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. O objetivo é modificar ou eliminar conteúdo, se o site direcionado se basear exclusivamente em cookies de sessão para autenticar o pedido recebido.The goal is to modify or delete content, if the targeted web site relies exclusively on session cookies to authenticate received request. Um intruso poderia explorar esta vulnerabilidade obtendo um navegador de um utilizador diferente para carregar um URL com um comando a partir de um site vulnerável no qual o utilizador já está iniciado.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. Existem muitas formas de um intruso fazer isso, como por exemplo hospedar um site diferente que carrega um recurso a partir do servidor vulnerável, ou fazer com que o utilizador clique num link.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. O ataque pode ser evitado se o servidor enviar um sinal adicional ao cliente, requer que o cliente inclua esse token em todos os pedidos futuros, e verifique que todos os pedidos futuros incluem um token que se refere à sessão atual, como por exemplo, utilizando o ASP.NET AntiForgeryToken ou ViewState.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 DetalhesDetails
ComponenteComponent API WebWeb API
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies MVC5, MVC6MVC5, MVC6
AtributosAttributes N/DN/A
ReferênciasReferences Prevenção de ataques de falsificação de pedidos de transcomerções (CSRF) em ASP.NET API webPreventing Cross-Site Request Forgery (CSRF) Attacks in ASP.NET Web API
PassosSteps Anti-CSRF e AJAX: O token do formulário pode ser um problema para os pedidos do AJAX, porque um pedido do AJAX pode enviar dados de JSON, não dados de formulário 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. Uma solução é enviar os tokens num cabeçalho HTTP personalizado.One solution is to send the tokens in a custom HTTP header. O código seguinte utiliza a sintaxe Razor para gerar os tokens e, em seguida, adiciona os tokens a um pedido do AJAX.The following code uses Razor syntax to generate the tokens, and then adds the tokens to an AJAX request.

ExemploExample

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

ExemploExample

Quando processar o pedido, extraia as fichas do cabeçalho do pedido.When you process the request, extract the tokens from the request header. Em seguida, ligue para o método AntiForgery.Validate para validar os tokens.Then call the AntiForgery.Validate method to validate the tokens. O método Valide abre uma exceção se as fichas não forem válidas.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);
}

ExemploExample

Formulários anti-CSRF e MVC ASP.NET - Utilize o método de ajuda AntiForgeryToken em Vistas; colocar um Html.AntiForgeryToken() na forma, por exemplo,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> 
}

ExemploExample

O exemplo acima irá dar produção como o seguinte: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>

ExemploExample

Ao mesmo tempo, html.AntiForgeryToken() dá ao visitante um cookie chamado __RequestVerificationToken, com o mesmo valor que o valor escondido aleatório acima indicado.At the same time, Html.AntiForgeryToken() gives the visitor a cookie called __RequestVerificationToken, with the same value as the random hidden value shown above. Em seguida, para validar um post de formulário de entrada, adicione o filtro [ValidateAntiForgeryToken] ao método de ação alvo.Next, to validate an incoming form post, add the [ValidateAntiForgeryToken] filter to the target action method. Por exemplo:For example:

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

Filtro de autorização que verifica:Authorization filter that checks that:

  • O pedido de entrada tem um cookie chamado __RequestVerificationTokenThe incoming request has a cookie called __RequestVerificationToken
  • O pedido de entrada tem uma Request.Form entrada chamada __RequestVerificationTokenThe incoming request has a Request.Form entry called __RequestVerificationToken
  • Estes cookies e Request.Form valores correspondem Assumindo que está tudo bem, o pedido passa normalmente.These cookie and Request.Form values match Assuming all is well, the request goes through as normal. Mas se não, então uma falha de autorização com mensagem "Um sinal anti-falsificação exigido não foi fornecido ou foi inválido".But if not, then an authorization failure with message “A required anti-forgery token was not supplied or was invalid”.
TítuloTitle DetalhesDetails
ComponenteComponent API WebWeb API
Fase SDLSDL Phase CompilarBuild
Tecnologias aplicáveisApplicable Technologies MVC5, MVC6MVC5, MVC6
AtributosAttributes Fornecedor de identidade - ADFS, Fornecedor de Identidade - Azure ADIdentity Provider - ADFS, Identity Provider - Azure AD
ReferênciasReferences Garantir uma API web com contas individuais e login local em ASP.NET Web API 2.2Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2
PassosSteps Se a API Web for protegida usando o OAuth 2.0, então espera um sinal ao portador no cabeçalho do pedido de autorização e concede acesso ao pedido apenas se o token for 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. Ao contrário da autenticação baseada em cookies, os navegadores não anexam os tokens ao portador de pedidos.Unlike cookie based authentication, browsers do not attach the bearer tokens to requests. O cliente que solicita precisa de anexar explicitamente o sinal do portador no cabeçalho do pedido.The requesting client needs to explicitly attach the bearer token in the request header. Portanto, para ASP.NET APIs web protegidos usando OAuth 2.0, os tokens portadores são considerados como uma defesa contra os ataques de CSRF.Therefore, for ASP.NET Web APIs protected using OAuth 2.0, bearer tokens are considered as a defense against CSRF attacks. Por favor, note que se a parte MVC da aplicação utiliza a autenticação de formulários (isto é, utiliza cookies), as fichas anti-falsificação têm de ser utilizadas pela aplicação web MVC.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.

ExemploExample

A API Web tem de ser informada para se basear apenas em fichas ao portador e não em cookies.The Web API has to be informed to rely ONLY on bearer tokens and not on cookies. Pode ser feito pela seguinte configuração em WebApiConfig.Register método:It can be done by the following configuration in WebApiConfig.Register method:

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

O método SupressEfaultHostAuthentication diz à Web API para ignorar qualquer autenticação que oace antes do pedido chegar ao pipeline Web API, seja por IIS ou por middleware 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. Dessa forma, podemos restringir a API web a autenticar apenas usando fichas portadoras.That way, we can restrict Web API to authenticate only using bearer tokens.