| Produto/Serviço |
Artigo |
|
Microsoft Entra ID |
|
|
Dispositivo IoT |
|
|
Azure DocumentDB |
|
|
ADFS |
|
|
Servidor de identidade |
|
|
Aplicativo Web |
|
|
API da Web |
|
Implementar a saída adequada usando os métodos MSAL ao usar o Microsoft Entra ID
Exemplo
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Events.OnRedirectToIdentityProviderForSignOut = async context =>
{
//Your logic here
};
});
Usar tempos de vida finitos para tokens SaS gerados
| Título |
Detalhes |
|
Componente |
Dispositivo IoT |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
N/D |
|
Etapas |
Tokens SaS gerados para autenticar no Hub IoT do Azure devem ter um período de expiração finito. Mantenha a duração dos tokens SAS no mínimo para limitar o tempo em que podem ser reutilizados caso sejam comprometidos. |
Usar tempos mínimos de tempo de vida do token para tokens de recurso gerados
| Título |
Detalhes |
|
Componente |
Banco de Dados de Documentos do Azure |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
N/D |
|
Etapas |
Reduza o intervalo de tempo do token de recurso para um valor mínimo necessário. Tokens de recurso têm um intervalo de tempo válido padrão de uma hora. |
Realizar o logout apropriado usando métodos WsFederation ao usar o ADFS
| Título |
Detalhes |
|
Componente |
ADFS |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
N/D |
|
Etapas |
Se o aplicativo depender do token de STS emitido pelo ADFS, o manipulador de eventos de logoff deverá chamar o método WSFederationAuthenticationModule.FederatedSignOut() para fazer logoff do usuário. Além disso, a sessão atual deve ser destruída, e o valor do token da sessão deve ser redefinido e tornado nulo. |
Exemplo
[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);
}
Implementar o logoff adequado ao usar o Identity Server
| Título |
Detalhes |
|
Componente |
Servidor de identidade |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
N/D |
|
Etapas |
O IdentityServer oferece suporte à federação com provedores de identidade externos. Quando um usuário sai de um provedor de identidade upstream, pode receber uma notificação, dependendo do protocolo usado. Isso permite que o IdentityServer notifique seus clientes para que eles também possam desconectar o usuário. Verifique a documentação na seção de referências para obter os detalhes da implementação. |
Os aplicativos disponíveis via HTTPS devem usar cookies seguros
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
EnvironmentType - OnPrem |
|
Referências |
httpCookies Element (Esquema de configurações ASP.NET), Propriedade HttpCookie.Secure |
|
Etapas |
Normalmente, os cookies só são acessíveis ao domínio para o qual foram definidos. Infelizmente, a definição de "domínio" não inclui o protocolo para que cookies criados por HTTPS sejam acessíveis via HTTP. O atributo "secure" indica para o navegador que o cookie deve ser disponibilizado apenas por HTTPS. Certifique-se de que todos os cookies definidos por HTTPS usem o atributo secure. Esse requisito pode ser imposto no arquivo web.config pela configuração do atributo requireSSL como true. Essa é a abordagem preferencial, pois vai impor o atributo secure a todos os cookies atuais e futuros, sem a necessidade de fazer qualquer alteração adicional no código. |
Exemplo
<configuration>
<system.web>
<httpCookies requireSSL="true"/>
</system.web>
</configuration>
A configuração é aplicada mesmo que HTTP seja usado para acessar o aplicativo. Se HTTP é usado para acessar o aplicativo, a configuração interrompe o aplicativo, pois os cookies estão definidos com o atributo secure e o navegador não os enviará de volta ao aplicativo.
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Formulários da Web, MVC5 |
|
Atributos |
EnvironmentType - OnPrem |
|
Referências |
N/D |
|
Etapas |
Quando o aplicativo Web for a terceira parte confiável, e o IdP for o servidor ADFS, o atributo secure do token FedAuth poderá ser configurado definindo requireSSL como True na seção system.identityModel.services de web.config: |
Exemplo
<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>
Todo aplicativo baseado em http deve especificar http somente para definição de cookie
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
Atributo de Cookie Seguro |
|
Etapas |
Para atenuar o risco de divulgação de informações com um ataque XSS (script entre sites), um novo atributo - httpOnly - foi introduzido aos cookies e é suportado por todos os principais navegadores. O atributo especifica que um cookie não pode ser acessado por script. Usando cookies HttpOnly, um aplicativo Web reduz a possibilidade de roubo de informações confidenciais contidas no cookie por meio de script e o envio dessas informações ao site de um invasor. |
Exemplo
Todos os aplicativos baseados em HTTP que usam cookies devem especificar HttpOnly na definição de cookie implementando a seguinte configuração em web.config:
<system.web>
.
.
<httpCookies requireSSL="false" httpOnlyCookies="true"/>
.
.
</system.web>
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Formulários Web |
|
Atributos |
N/D |
|
Referências |
Propriedade FormsAuthentication.RequireSSL |
|
Etapas |
O valor da propriedade RequireSSL é definido no arquivo de configuração para um aplicativo ASP.NET usando o atributo requireSSL do elemento de configuração. Você pode especificar no arquivo Web.config do seu aplicativo ASP.NET se o protocolo TLS, anteriormente conhecido como SSL (Secure Sockets Layer), é necessário, definindo o atributo requireSSL para que o cookie de autenticação de formulários seja retornado ao servidor. |
Exemplo
O exemplo de código a seguir define o atributo requireSSL no arquivo Web.config.
<authentication mode="Forms">
<forms loginUrl="member_login.aspx" cookieless="UseCookies" requireSSL="true"/>
</authentication>
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
MVC5 |
|
Atributos |
EnvironmentType - OnPrem |
|
Referências |
Configuração do Windows Identity Foundation (WIF) – Part II |
|
Etapas |
Para definir o atributo httpOnly para cookies FedAuth, o valor do atributo hideFromScript deve ser definido como True. |
Exemplo
A configuração a seguir mostra a configuração correta:
<federatedAuthentication>
<cookieHandler mode="Custom"
hideFromScript="true"
name="FedAuth"
path="/"
requireSsl="true"
persistentSessionLifetime="25">
</cookieHandler>
</federatedAuthentication>
Atenuar ataques CSRF (solicitação intersite forjada) em páginas Web ASP.NET
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
N/D |
|
Etapas |
A CSRF ou XSRF (solicitação intersite forjada) é um tipo de ataque em que um invasor pode realizar ações no contexto de segurança da sessão estabelecida de um usuário diferente em um site da Web. A meta é modificar ou excluir o conteúdo, caso o site de destino dependa exclusivamente de cookies de sessão para autenticar a solicitação recebida. Um invasor pode explorar essa vulnerabilidade fazendo com que um navegador diferente de um usuário carregue uma URL com um comando de um site vulnerável no qual o usuário já esteja conectado. Há muitas maneiras de um invasor fazer isso, como hospedando um site diferente que carrega um recurso do servidor vulnerável ou fazendo o usuário clicar em um link. Esse ataque pode ser evitado se o servidor enviar um token adicional ao cliente, exigir que o cliente inclua esse token em todas as solicitações futuras e verificar se todas as solicitações futuras incluem um token que pertence à sessão atual, por exemplo, usando o ASP.NET AntiForgeryToken ou ViewState. |
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
MVC5, MVC6 |
|
Atributos |
N/D |
|
Referências |
Prevenção de XSRF/CSRF no ASP.NET MVC e em páginas da Web |
|
Etapas |
Formulários MVC Anti-CSRF e do ASP.NET – Use o método auxiliar AntiForgeryToken em Exibições; coloque um Html.AntiForgeryToken() no formulário, por exemplo, |
Exemplo
@using (Html.BeginForm("UserProfile", "SubmitUpdate")) {
@Html.ValidationSummary(true)
@Html.AntiForgeryToken()
<fieldset>
Exemplo
<form action="/UserProfile/SubmitUpdate" method="post">
<input name="__RequestVerificationToken" type="hidden" value="saTFWpkKN0BYazFtN6c4YbZAmsEwG0srqlUqqloi/fVgeV2ciIFVmelvzwRZpArs" />
<!-- rest of form goes here -->
</form>
Exemplo
Ao mesmo tempo, Html.AntiForgeryToken() fornece ao visitante um cookie chamado __RequestVerificationToken, com o mesmo valor que o valor oculto aleatório mostrado acima. Em seguida, para validar o envio de um formulário, adicione o filtro [ValidateAntiForgeryToken] ao método de ação de destino. Por exemplo:
[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
// ... etc.
}
Filtro de autorização que verifica se:
- A solicitação de entrada tem um cookie chamado __RequestVerificationToken
- A solicitação de entrada tem um
Request.Form chamado __RequestVerificationToken
- O cookie e o valor
Request.Form são correspondentes. Supondo que tudo esteja certo, a solicitação passará normalmente. Mas, se não for o caso, uma falha de autorização com a mensagem "Um token antifalsificação necessário não foi fornecido ou era inválido".
Exemplo
Anti-CSRF e AJAX: O token do formulário pode ser um problema para solicitações AJAX, pois uma solicitação AJAX pode enviar dados JSON, não dados de formulário HTML. Uma solução é enviar os tokens em um cabeçalho HTTP personalizado. O código a seguir usa a sintaxe Razor para gerar os tokens e adiciona os tokens a uma solicitação AJAX.
<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>
Exemplo
Ao processar a solicitação, extraia os tokens do cabeçalho da solicitação. Em seguida, chame o método AntiForgery.Validate para validar os tokens. O método Validate lança uma exceção se os tokens não forem válidos.
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ítulo |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Formulários Web |
|
Atributos |
N/D |
|
Referências |
Tirar proveito dos recursos internos do ASP.NET para afastar os ataques na Web |
|
Etapas |
Os ataques CSRF em aplicativos baseados em WebForm podem ser minimizados definindo ViewStateUserKey para uma cadeia de caracteres aleatória que varia para cada usuário - ID de usuário ou, melhor ainda, ID de sessão. Por diversos motivos técnicos e sociais, o identificador de sessão é uma opção bem melhor, pois é imprevisível, expira após determinado período e varia para cada usuário. |
Exemplo
Aqui está o código necessário em todas as suas páginas:
void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
:
}
Configurar a sessão para o tempo de vida de inatividade
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
Propriedade HttpSessionState.Timeout |
|
Etapas |
O tempo limite de sessão representa o evento que ocorre quando um usuário não realiza nenhuma ação em um site durante um intervalo (definido pelo servidor Web). O evento, no lado do servidor, altera o status da sessão do usuário para "inválida" (por exemplo, "não mais utilizada") e instrui o servidor Web a destruí-la (excluindo todos os dados contidos nela). O exemplo de código a seguir define o atributo de tempo limite de sessão como 15 minutos no arquivo Web.config. |
Exemplo
<configuration>
<system.web>
<sessionState mode="InProc" cookieless="true" timeout="15" />
</system.web>
</configuration>
Ativar a detecção de ameaças no SQL Azure
Exemplo
<forms name=".ASPXAUTH" loginUrl="login.aspx" defaultUrl="default.aspx" protection="All" timeout="15" path="/" requireSSL="true" slidingExpiration="true"/>
</forms>
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Formulários da Web, MVC5 |
|
Atributos |
EnvironmentType - OnPrem |
|
Referências |
asdeqa |
|
Etapas |
Quando o aplicativo da Web for Relying Party e o ADFS for o STS, a vida útil dos cookies de autenticação - tokens FedAuth - pode ser definida pela seguinte configuração no web.config: |
Exemplo
<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>
Exemplo
Além disso, o tempo de vida do token da declaração SAML emitida pelo ADFS deve ser definido como 15 minutos, executando o seguinte comando powershell no servidor ADFS:
Set-ADFSRelyingPartyTrust -TargetName "<RelyingPartyWebApp>" -ClaimsProviderName @("Active Directory") -TokenLifetime 15 -AlwaysRequireAuthentication $true
Implementar o logout apropriado do aplicativo
| Título |
Detalhes |
|
Componente |
Aplicativo Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
N/D |
|
Etapas |
Execute uma Saída adequada do aplicativo, quando o usuário pressionar o botão logoff. Após o logoff, o aplicativo deve destruir a sessão do usuário e também redefinir e anular o valor do cookie de sessão, juntamente com a redefinição e anulação do valor do cookie de autenticação. Além disso, quando várias sessões estiverem vinculadas a uma única identidade de usuário, elas deverão ser coletivamente encerradas no lado do servidor quando ocorrer o tempo limite ou o logout. Por fim, certifique-se de que o recurso de Logout esteja disponível em cada página. |
Atenuar ataques CSRF (solicitação intersite forjada) em ASP.NET Web APIs
| Título |
Detalhes |
|
Componente |
API Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
Genérico |
|
Atributos |
N/D |
|
Referências |
N/D |
|
Etapas |
A CSRF ou XSRF (solicitação intersite forjada) é um tipo de ataque em que um invasor pode realizar ações no contexto de segurança da sessão estabelecida de um usuário diferente em um site da Web. A meta é modificar ou excluir o conteúdo, caso o site de destino dependa exclusivamente de cookies de sessão para autenticar a solicitação recebida. Um invasor pode explorar essa vulnerabilidade fazendo com que um navegador diferente de um usuário carregue uma URL com um comando de um site vulnerável no qual o usuário já esteja conectado. Há muitas maneiras de um invasor fazer isso, como hospedando um site diferente que carrega um recurso do servidor vulnerável ou fazendo o usuário clicar em um link. Esse ataque pode ser evitado se o servidor enviar um token adicional ao cliente, exigir que o cliente inclua esse token em todas as solicitações futuras e verificar se todas as solicitações futuras incluem um token que pertence à sessão atual, por exemplo, usando o ASP.NET AntiForgeryToken ou ViewState. |
| Título |
Detalhes |
|
Componente |
API Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
MVC5, MVC6 |
|
Atributos |
N/D |
|
Referências |
Impedir ataques CSRF (solicitação intersite forjada) em ASP.NET Web APIs |
|
Etapas |
Anti-CSRF e AJAX: O token do formulário pode ser um problema para solicitações AJAX, pois uma solicitação AJAX pode enviar dados JSON, não dados de formulário HTML. Uma solução é enviar os tokens em um cabeçalho HTTP personalizado. O código a seguir usa a sintaxe Razor para gerar os tokens e adiciona os tokens a uma solicitação AJAX. |
Exemplo
<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>
Exemplo
Ao processar a solicitação, extraia os tokens do cabeçalho da solicitação. Em seguida, chame o método AntiForgery.Validate para validar os tokens. O método Validate lança uma exceção se os tokens não forem válidos.
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);
}
Exemplo
Formulários MVC Anti-CSRF e do ASP.NET – Use o método auxiliar AntiForgeryToken em Exibições; coloque um Html.AntiForgeryToken() no formulário, por exemplo,
@using (Html.BeginForm("UserProfile", "SubmitUpdate")) {
@Html.ValidationSummary(true)
@Html.AntiForgeryToken()
<fieldset>
}
Exemplo
O exemplo acima produzirá algo como o seguinte:
<form action="/UserProfile/SubmitUpdate" method="post">
<input name="__RequestVerificationToken" type="hidden" value="saTFWpkKN0BYazFtN6c4YbZAmsEwG0srqlUqqloi/fVgeV2ciIFVmelvzwRZpArs" />
<!-- rest of form goes here -->
</form>
Exemplo
Ao mesmo tempo, Html.AntiForgeryToken() fornece ao visitante um cookie chamado __RequestVerificationToken, com o mesmo valor que o valor oculto aleatório mostrado acima. Em seguida, para validar o envio de um formulário, adicione o filtro [ValidateAntiForgeryToken] ao método de ação de destino. Por exemplo:
[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
// ... etc.
}
Filtro de autorização que verifica se:
- A solicitação de entrada tem um cookie chamado __RequestVerificationToken
- A solicitação de entrada tem um
Request.Form chamado __RequestVerificationToken
- O cookie e o valor
Request.Form são correspondentes. Supondo que tudo esteja certo, a solicitação passará normalmente. Mas, se não for o caso, uma falha de autorização com a mensagem "Um token antifalsificação necessário não foi fornecido ou era inválido".
| Título |
Detalhes |
|
Componente |
API Web |
|
Fase do SDL |
Construir |
|
Tecnologias aplicáveis |
MVC5, MVC6 |
|
Atributos |
Provedor de Identidade — ADFS, Provedor de Identidade — Microsoft Entra ID |
|
Referências |
Proteger uma API Web com contas individuais e logon local na ASP.NET Web API 2.2 |
|
Etapas |
Se a API Web for protegida usando OAuth 2.0, ela esperará um token de portador no cabeçalho de solicitação de Autorização e a concederá o acesso à solicitação somente se o token for válido. Diferentemente da autenticação baseada em cookie, os navegadores não anexam os tokens de portador às solicitações. O cliente solicitante deve anexar explicitamente o token de portador no cabeçalho da solicitação. Portanto, para ASP.NET Web APIs protegidos usando o OAuth 2.0, os tokens de portador são considerados uma defesa contra ataques de CSRF. Observe que, se a parte MVC do aplicativo usar a autenticação de formulários (ou seja, cookies), será necessário usar tokens antifalsificação pelo aplicativo Web do MVC. |
Exemplo
A API Web precisa ser informada para confiar SOMENTE em tokens de portador e não em cookies. Isso pode ser feito pela configuração a seguir no WebApiConfig.Register método:
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
O método SuppressDefaultHostAuthentication instrui a API da Web a ignorar qualquer autenticação que ocorra antes de a solicitação alcançar o pipeline da API da Web, seja pelo IIS ou pelo middleware OWIN. Dessa forma, podemos restringir a API da Web para autenticar somente usando tokens de portador.