Proteger uma API Web com contas individuais e logon Local na API Web ASP.NET 2.2Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2

por Mike Wassonby Mike Wasson

Baixe o aplicativo de exemploDownload Sample App

Este tópico mostra como proteger uma API web usando OAuth2 para autenticar em relação a um banco de dados de associação.This topic shows how to secure a web API using OAuth2 to authenticate against a membership database.

Versões de software usadas no tutorialSoftware versions used in the tutorial

No Visual Studio 2013, o modelo de projeto de API Web fornece três opções para autenticação:In Visual Studio 2013, the Web API project template gives you three options for authentication:

  • Contas individuais.Individual accounts. O aplicativo usa um banco de dados de associação.The app uses a membership database.
  • Contas organizacionais.Organizational accounts. Os usuários entram com suas do Active Directory do Azure, Office 365 ou as credenciais do Active Directory local.Users sign in with their Azure Active Directory, Office 365, or on-premise Active Directory credentials.
  • Autenticação do Windows.Windows authentication. Essa opção destina-se a aplicativos de Intranet e usa o módulo do IIS de autenticação do Windows.This option is intended for Intranet applications, and uses the Windows Authentication IIS module.

Para obter mais detalhes sobre essas opções, consulte Criando projetos Web do ASP.NET no Visual Studio 2013.For more details about these options, see Creating ASP.NET Web Projects in Visual Studio 2013.

Contas individuais fornecem duas maneiras para um usuário faça logon:Individual accounts provide two ways for a user to log in:

  • Logon local.Local login. O usuário se registra no site, inserir um nome de usuário e senha.The user registers at the site, entering a username and password. O aplicativo armazena o hash de senha no banco de dados de associação.The app stores the password hash in the membership database. Quando o usuário fizer logon, o sistema ASP.NET Identity verificará a senha.When the user logs in, the ASP.NET Identity system verifies the password.
  • Logon social.Social login. O usuário entra com um serviço externo, como Facebook, Microsoft ou Google.The user signs in with an external service, such as Facebook, Microsoft, or Google. O aplicativo ainda cria uma entrada para o usuário no banco de dados de associação, mas não armazena credenciais.The app still creates an entry for the user in the membership database, but does not store any credentials. O usuário é autenticado depois de entrar em um serviço externo.The user authenticates by signing into the external service.

Este artigo aborda o cenário de logon local.This article looks at the local login scenario. Para logon local e social, API Web usa OAuth2 para autenticar solicitações.For both local and social login, Web API uses OAuth2 to authenticate requests. No entanto, os fluxos de credencial são diferentes para logon social e local.However, the credential flows are different for local and social login.

Neste artigo, demonstrarei um aplicativo simples que permite que o usuário faça logon e enviar chamadas AJAX autenticadas para uma API da web.In this article, I'll demonstrate a simple app that lets the user log in and send authenticated AJAX calls to a web API. Você pode baixar o código de exemplo aqui.You can download the sample code here. O arquivo leiame descreve como criar o exemplo do zero no Visual Studio.The readme describes how to create the sample from scratch in Visual Studio.

O aplicativo de exemplo usa o Knockout. js para vinculação de dados e jQuery para enviar solicitações AJAX.The sample app uses Knockout.js for data-binding and jQuery for sending AJAX requests. O foco será nas chamadas AJAX, portanto você não precisa saber o Knockout. js para este artigo.I'll be focusing on the AJAX calls, so you don't need to know Knockout.js for this article.

Ao longo do caminho, que descreverei:Along the way, I'll describe:

  • O que o aplicativo está fazendo no lado do cliente.What the app is doing on the client side.
  • O que está acontecendo no servidor.What's happening on the server.
  • O tráfego HTTP no meio.The HTTP traffic in the middle.

Primeiro, precisamos definir algumas terminologias OAuth2.First, we need to define some OAuth2 terminology.

  • Recurso.Resource. Alguma parte dos dados que podem ser protegidos.Some piece of data that can be protected.
  • Servidor de recurso.Resource server. O servidor que hospeda o recurso.The server that hosts the resource.
  • Proprietário do recurso.Resource owner. A entidade que pode conceder permissão para acessar um recurso.The entity that can grant permission to access a resource. (Normalmente o usuário.)(Typically the user.)
  • Cliente: O aplicativo que deseja acessar o recurso.Client: The app that wants access to the resource. Neste artigo, o cliente é um navegador da web.In this article, the client is a web browser.
  • Token de acesso.Access token. Um token que concede acesso a um recurso.A token that grants access to a resource.
  • Token de portador.Bearer token. Um determinado tipo de token de acesso, com a propriedade que qualquer pessoa pode usar o token.A particular type of access token, with the property that anyone can use the token. Em outras palavras, um cliente não precisa de uma chave de criptografia ou outro segredo para usar um token de portador.In other words, a client doesn't need a cryptographic key or other secret to use a bearer token. Por esse motivo, os tokens de portador só devem ser usados por um HTTPS e devem ter tempos de expiração relativamente curto.For that reason, bearer tokens should only be used over a HTTPS, and should have relatively short expiration times.
  • Servidor de autorização.Authorization server. Um servidor que fornece tokens de acesso.A server that gives out access tokens.

Um aplicativo pode agir como servidor de autorização e o servidor de recursos.An application can act as both authorization server and resource server. O modelo de projeto de Web API segue esse padrão.The Web API project template follows this pattern.

Fluxo de credenciais de logon localLocal Login Credential Flow

Para logon local, API Web usa a fluxo de senha de proprietário do recurso definidos no OAuth2.For local login, Web API uses the resource owner password flow defined in OAuth2.

  1. O usuário insere um nome e uma senha para o cliente.The user enters a name and password into the client.
  2. O cliente envia essas credenciais para o servidor de autorização.The client sends these credentials to the authorization server.
  3. O servidor de autorização autentica as credenciais e retorna um token de acesso.The authorization server authenticates the credentials and returns an access token.
  4. Para acessar um recurso protegido, o cliente inclui o token de acesso no cabeçalho de autorização da solicitação HTTP.To access a protected resource, the client includes the access token in the Authorization header of the HTTP request.

Quando você seleciona contas individuais no modelo de projeto de API da Web, o projeto inclui um servidor de autorização que valida as credenciais do usuário e emite tokens.When you select Individual accounts in the Web API project template, the project includes an authorization server that validates user credentials and issues tokens. O diagrama a seguir mostra o mesmo fluxo de credenciais em termos de componentes de API da Web.The following diagram shows the same credential flow in terms of Web API components.

Nesse cenário, os controladores de API Web atuam como servidores de recurso.In this scenario, Web API controllers act as resource servers. Um filtro de autenticação valida os tokens de acesso e o [autorizar] atributo é usado para proteger um recurso.An authentication filter validates access tokens, and the [Authorize] attribute is used to protect a resource. Quando um controlador ou ação tem o [autorizar] de atributo, todas as solicitações para esse controlador ou ação deve ser autenticada.When a controller or action has the [Authorize] attribute, all requests to that controller or action must be authenticated. Caso contrário, a autorização é negada e API Web retorna um erro de 401 (não autorizado).Otherwise, authorization is denied, and Web API returns a 401 (Unauthorized) error.

O servidor de autorização e o filtro de autenticação que chamam em uma middleware OWIN componente que manipula os detalhes do OAuth2.The authorization server and the authentication filter both call into an OWIN middleware component that handles the details of OAuth2. Descreverei o design em mais detalhes posteriormente neste tutorial.I'll describe the design in more detail later in this tutorial.

Enviando uma solicitação não autorizadaSending an Unauthorized Request

Para começar, execute o aplicativo e clique no chamar a API botão.To get started, run the app and click the Call API button. Quando a solicitação for concluída, você verá uma mensagem de erro no resultado caixa.When the request completes, you should see an error message in the Result box. Isso ocorre porque a solicitação não contém um token de acesso, portanto, a solicitação é autorizada.That's because the request does not contain an access token, so the request is unauthorized.

O chamar a API botão envia uma solicitação AJAX ao ~/api/valores, que invoca uma ação do controlador de API da Web.The Call API button sends an AJAX request to ~/api/values, which invokes a Web API controller action. Aqui está a seção de código JavaScript que envia a solicitação AJAX.Here is the section of JavaScript code that sends the AJAX request. No aplicativo de exemplo, todo o código de aplicativo do JavaScript está localizado no arquivo Scripts\app.js.In the sample app, all of the JavaScript app code is located in the Scripts\app.js file.

// If we already have a bearer token, set the Authorization header.
var token = sessionStorage.getItem(tokenKey);
var headers = {};
if (token) {
    headers.Authorization = 'Bearer ' + token;
}

$.ajax({
    type: 'GET',
    url: 'api/values/1',
    headers: headers
}).done(function (data) {
    self.result(data);
}).fail(showError);

Até que o usuário fizer logon, há nenhum token de portador e, portanto, nenhum cabeçalho de autorização na solicitação.Until the user logs in, there is no bearer token, and therefore no Authorization header in the request. Isso faz com que a solicitação para retornar um erro 401.This causes the request to return a 401 error.

Aqui está a solicitação HTTP.Here is the HTTP request. (Eu usei Fiddler para capturar o tráfego HTTP.)(I used Fiddler to capture the HTTP traffic.)

GET https://localhost:44305/api/values HTTP/1.1
Host: localhost:44305
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: */*
Accept-Language: en-US,en;q=0.5
X-Requested-With: XMLHttpRequest
Referer: https://localhost:44305/

Resposta HTTP:HTTP response:

HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
WWW-Authenticate: Bearer
Date: Tue, 30 Sep 2014 21:54:43 GMT
Content-Length: 61

{"Message":"Authorization has been denied for this request."}

Observe que a resposta inclui um cabeçalho Www-Authenticate com o desafio definido como portador.Notice that the response includes a Www-Authenticate header with the challenge set to Bearer. Que indica que o servidor espera que um token de portador.That indicates the server expects a bearer token.

Registrar um usuárioRegister a User

No registre seção do aplicativo, insira um email e senha e clique no registrar botão.In the Register section of the app, enter an email and password, and click the Register button.

Você não precisa usar um endereço de email válido para este exemplo, mas um aplicativo real deve confirmar o endereço.You don't need to use a valid email address for this sample, but a real app would confirm the address. (Consulte criar um aplicativo de web do ASP.NET MVC 5 seguro com logon, redefinição de senha e de confirmação de email.) A senha, use algo como "Password1!", com uma letra maiuscula, letra minúscula, número e caractere não alfanumérico.(See Create a secure ASP.NET MVC 5 web app with log in, email confirmation and password reset.) For the password, use something like "Password1!", with an upper case letter, lower case letter, number, and non-alpha-numeric character. Para manter o aplicativo simples, eu deixei de fora a validação do lado do cliente, portanto, se houver um problema com o formato da senha, você obterá um erro 400 (solicitação incorreta).To keep the app simple, I left out client-side validation, so if there is a problem with the password format, you'll get a 400 (Bad Request) error.

O registrar botão envia uma solicitação POST para ~/api/Account/Register /.The Register button sends a POST request to ~/api/Account/Register/. O corpo da solicitação é um objeto JSON que contém o nome e senha.The request body is a JSON object that holds the name and password. Aqui está o código JavaScript que envia a solicitação:Here is the JavaScript code that sends the request:

var data = {
    Email: self.registerEmail(),
    Password: self.registerPassword(),
    ConfirmPassword: self.registerPassword2()
};

$.ajax({
    type: 'POST',
    url: '/api/Account/Register',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(data)
}).done(function (data) {
    self.result("Done!");
}).fail(showError);

Solicitação HTTP:HTTP request:

POST https://localhost:44305/api/Account/Register HTTP/1.1
Host: localhost:44305
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: */*
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: https://localhost:44305/
Content-Length: 84

{"Email":"alice@example.com","Password":"Password1!","ConfirmPassword":"Password1!"}

Resposta HTTP:HTTP response:

HTTP/1.1 200 OK
Server: Microsoft-IIS/8.0
Date: Wed, 01 Oct 2014 00:57:58 GMT
Content-Length: 0

Essa solicitação é tratada pelo AccountController classe.This request is handled by the AccountController class. Internamente, AccountController usa a identidade do ASP.NET para gerenciar o banco de dados de associação.Internally, AccountController uses ASP.NET Identity to manage the membership database.

Se você executar o aplicativo localmente no Visual Studio, as contas de usuário são armazenadas no LocalDB, na tabela AspNetUsers.If you run the app locally from Visual Studio, user accounts are stored in LocalDB, in the AspNetUsers table. Para exibir as tabelas no Visual Studio, clique o modo de exibição menu, selecione Gerenciador de servidores, em seguida, expanda conexões de dados.To view the tables in Visual Studio, click the View menu, select Server Explorer, then expand Data Connections.

Obter um acesso de TokenGet an Access Token

Até agora não fizemos nenhum OAuth, mas agora veremos o servidor de autorização do OAuth em ação, quando solicitamos um token de acesso.So far we have not done any OAuth, but now we'll see the OAuth authorization server in action, when we request an access token. No fazer logon área do aplicativo de exemplo, insira o email e senha e clique em Log In.In the Log In area of the sample app, enter the email and password and click Log In.

O fazer logon botão envia uma solicitação para o ponto de extremidade de token.The Log In button sends a request to the token endpoint. O corpo da solicitação contém os dados codificados de url do formulário a seguir:The body of the request contains the following form-url-encoded data:

  • grant_type: "password"grant_type: "password"
  • nome de usuário: <o email do usuário>username: <the user's email>
  • senha: <senha>password: <password>

Aqui está o código JavaScript que envia a solicitação AJAX:Here is the JavaScript code that sends the AJAX request:

var loginData = {
    grant_type: 'password',
    username: self.loginEmail(),
    password: self.loginPassword()
};

$.ajax({
    type: 'POST',
    url: '/Token',
    data: loginData
}).done(function (data) {
    self.user(data.userName);
    // Cache the access token in session storage.
    sessionStorage.setItem(tokenKey, data.access_token);
}).fail(showError);

Se a solicitação for bem-sucedida, o servidor de autorização retorna um token de acesso no corpo da resposta.If the request succeeds, the authorization server returns an access token in the response body. Observe que podemos armazenar o token no armazenamento de sessão, para usar mais tarde ao enviar solicitações para a API.Notice that we store the token in session storage, to use later when sending requests to the API. Ao contrário de algumas formas de autenticação (como a autenticação baseada em cookie), o navegador não incluirá automaticamente o token de acesso em solicitações subsequentes.Unlike some forms of authentication (such as cookie-based authentication), the browser will not automatically include the access token in subsequent requests. O aplicativo deve fazer isso explicitamente.The application must do so explicitly. Isso é algo bom, porque limita vulnerabilidades CSRF.That's a good thing, because it limits CSRF vulnerabilities.

Solicitação HTTP:HTTP request:

POST https://localhost:44305/Token HTTP/1.1
Host: localhost:44305
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: https://localhost:44305/
Content-Length: 68

grant_type=password&username=alice%40example.com&password=Password1!

Você pode ver que a solicitação contém as credenciais do usuário.You can see that the request contains the user's credentials. Você deve usar HTTPS para fornecer segurança de camada de transporte.You must use HTTPS to provide transport layer security.

Resposta HTTP:HTTP response:

HTTP/1.1 200 OK
Content-Length: 669
Content-Type: application/json;charset=UTF-8
Server: Microsoft-IIS/8.0
Date: Wed, 01 Oct 2014 01:22:36 GMT

{
  "access_token":"imSXTs2OqSrGWzsFQhIXziFCO3rF...",
  "token_type":"bearer",
  "expires_in":1209599,
  "userName":"alice@example.com",
  ".issued":"Wed, 01 Oct 2014 01:22:33 GMT",
  ".expires":"Wed, 15 Oct 2014 01:22:33 GMT"
}

Para facilitar a leitura, eu recuada o JSON e truncado o token de acesso, que é muito longo.For readability, I indented the JSON and truncated the access token, which is a quite long.

O access_token, token_type, e expires_in propriedades são definidas pela especificação OAuth2. As outras propriedades (userName, .issued, e .expires) são apenas para fins informativos.The access_token, token_type, and expires_in properties are defined by the OAuth2 spec. The other properties (userName, .issued, and .expires) are just for informational purposes. Você pode encontrar o código que adiciona essas propriedades adicionais no TokenEndpoint método, no arquivo /Providers/ApplicationOAuthProvider.cs.You can find the code that adds those additional properties in the TokenEndpoint method, in the /Providers/ApplicationOAuthProvider.cs file.

Enviar uma solicitação autenticadaSend an Authenticated Request

Agora que temos um token de portador, fazemos uma solicitação autenticada para a API.Now that we have a bearer token, we can make an authenticated request to the API. Isso é feito definindo o cabeçalho de autorização na solicitação.This is done by setting the Authorization header in the request. Clique o chamar a API botão novamente para vê-lo.Click the Call API button again to see this.

Solicitação HTTP:HTTP request:

GET https://localhost:44305/api/values/1 HTTP/1.1
Host: localhost:44305
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: */*
Authorization: Bearer imSXTs2OqSrGWzsFQhIXziFCO3rF...
X-Requested-With: XMLHttpRequest

Resposta HTTP:HTTP response:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
Date: Wed, 01 Oct 2014 01:41:29 GMT
Content-Length: 27

"Hello, alice@example.com."

Fazer logoffLog Out

Porque o navegador não armazena em cache as credenciais ou o token de acesso, fazer logoff é simplesmente uma questão de "esquecer" o token, removendo-o do armazenamento de sessão:Because the browser does not cache the credentials or the access token, logging out is simply a matter of "forgetting" the token, by removing it from session storage:

self.logout = function () {
    sessionStorage.removeItem(tokenKey)
}

Noções básicas sobre o modelo de projeto contas individuaisUnderstanding the Individual Accounts Project Template

Quando você seleciona contas individuais no modelo de projeto de aplicativo Web ASP.NET, o projeto inclui:When you select Individual Accounts in the ASP.NET Web Application project template, the project includes:

  • Um servidor de autorização OAuth2.An OAuth2 authorization server.
  • Um ponto de extremidade de API da Web para gerenciar contas de usuárioA Web API endpoint for managing user accounts
  • Um modelo do EF para armazenar contas de usuário.An EF model for storing user accounts.

Aqui estão as classes de aplicativo principal que implementam esses recursos:Here are the main application classes that implement these features:

  • AccountController.AccountController. Fornece um ponto de extremidade de API da Web para gerenciar contas de usuário.Provides a Web API endpoint for managing user accounts. O Register ação é a única que usamos neste tutorial.The Register action is the only one that we used in this tutorial. Outros métodos na classe dão suporte a redefinição de senha, os logons sociais e outras funcionalidades.Other methods on the class support password reset, social logins, and other functionality.
  • ApplicationUser, definido em /Models/IdentityModels.cs.ApplicationUser, defined in /Models/IdentityModels.cs. Essa classe é o modelo do EF para contas de usuário no banco de dados de associação.This class is the EF model for user accounts in the membership database.
  • ApplicationUserManager, definido no /App_Start/IdentityConfig.cs essa classe deriva UserManager e executa operações em contas de usuário, como a criação de um novo usuário, verificando as senhas e assim por diante e persiste automaticamente alterações no banco de dados.ApplicationUserManager, defined in /App_Start/IdentityConfig.cs This class derives from UserManager and performs operations on user accounts, such as creating a new user, verifying passwords, and so forth, and automatically persists changes to the database.
  • ApplicationOAuthProvider.ApplicationOAuthProvider. Esse objeto se vincula ao middleware OWIN e processa os eventos gerados pelo middleware.This object plugs into the OWIN middleware, and processes events raised by the middleware. Ele deriva OAuthAuthorizationServerProvider.It derives from OAuthAuthorizationServerProvider.

Configurando o servidor de autorizaçãoConfiguring the Authorization Server

StartupAuth.cs, o código a seguir configura o servidor de autorização OAuth2.In StartupAuth.cs, the following code configures the OAuth2 authorization server.

PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
    // Note: Remove the following line before you deploy to production:
    AllowInsecureHttp = true
};

// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);

O TokenEndpointPath propriedade é o caminho de URL para o ponto de extremidade do servidor de autorização.The TokenEndpointPath property is the URL path to the authorization server endpoint. Essa é a URL que o aplicativo usa para obter os tokens de portador.That's the URL that app uses to get the bearer tokens.

O Provider propriedade especifica um provedor que se vincula ao middleware OWIN e processa os eventos gerados pelo middleware.The Provider property specifies a provider that plugs into the OWIN middleware, and processes events raised by the middleware.

Aqui está o fluxo básico quando o aplicativo deseja obter um token:Here is the basic flow when the app wants to get a token:

  1. Para obter um token de acesso, o aplicativo envia uma solicitação para ~ / Token.To get an access token, the app sends a request to ~/Token.
  2. As chamadas de middleware OAuth GrantResourceOwnerCredentials no provedor.The OAuth middleware calls GrantResourceOwnerCredentials on the provider.
  3. O provedor chamar o ApplicationUserManager para validar as credenciais e criar uma identidade baseada em declarações.The provider calls the ApplicationUserManager to validate the credentials and create a claims identity.
  4. Se isso ocorrer, o provedor cria um tíquete de autenticação, que é usado para gerar o token.If that succeeds, the provider creates an authentication ticket, which is used to generate the token.

O middleware OAuth não sabe nada sobre as contas de usuário.The OAuth middleware doesn't know anything about the user accounts. O provedor se comunica entre a identidade do ASP.NET e middleware.The provider communicates between the middleware and ASP.NET Identity. Para obter mais informações sobre como implementar o servidor de autorização, consulte servidor de autorização OAuth 2.0 OWIN.For more information about implementing the authorization server, see OWIN OAuth 2.0 Authorization Server.

Configurando a API da Web para usar os Tokens de portadorConfiguring Web API to use Bearer Tokens

No WebApiConfig.Register método, o código a seguir configura a autenticação para o pipeline da API da Web:In the WebApiConfig.Register method, the following code sets up authentication for the Web API pipeline:

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

O HostAuthenticationFilter classe permite a autenticação usando tokens de portador.The HostAuthenticationFilter class enables authentication using bearer tokens.

O SuppressDefaultHostAuthentication método informa a API da Web para ignorar qualquer autenticação que acontece antes que a solicitação atinja o pipeline da API Web por IIS ou o middleware do 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 pode restringir a API da Web para autenticar usando apenas tokens de portador.That way, we can restrict Web API to authenticate only using bearer tokens.

Note

Em particular, a parte MVC do seu aplicativo pode usar a autenticação de formulários, que armazena as credenciais em um cookie.In particular, the MVC portion of your app might use forms authentication, which stores credentials in a cookie. Autenticação baseada em cookie requer o uso de tokens antifalsificação, para evitar ataques de CSRF.Cookie-based authentication requires the use of anti-forgery tokens, to prevent CSRF attacks. Isso é um problema para APIs web, porque não há nenhuma maneira conveniente para a API da web para enviar o token antifalsificação ao cliente.That's a problem for web APIs, because there is no convenient way for the web API to send the anti-forgery token to the client. (Para obter mais informações sobre esse problema, consulte impedindo ataques de CSRF na API Web.) Chamando SuppressDefaultHostAuthentication garante que a API da Web não está vulnerável a ataques de CSRF de credenciais armazenadas em cookies.(For more background on this issue, see Preventing CSRF Attacks in Web API.) Calling SuppressDefaultHostAuthentication ensures that Web API is not vulnerable to CSRF attacks from credentials stored in cookies.

Quando o cliente solicita um recurso protegido, aqui está o que acontece no pipeline da API Web:When the client requests a protected resource, here is what happens in the Web API pipeline:

  1. O HostAuthentication filtro chama o middleware de OAuth para validar o token.The HostAuthentication filter calls the OAuth middleware to validate the token.
  2. O middleware converte o token em uma identidade baseada em declarações.The middleware converts the token into a claims identity.
  3. Neste ponto, a solicitação é autenticado , mas não autorizado.At this point, the request is authenticated but not authorized.
  4. O filtro de autorização examina a identidade baseada em declarações.The authorization filter examines the claims identity. Se as declarações de autorizam o usuário para esse recurso, a solicitação é autorizada.If the claims authorize the user for that resource, the request is authorized. Por padrão, o [autorizar] atributo autorizará qualquer solicitação que é autenticada.By default, the [Authorize] attribute will authorize any request that is authenticated. No entanto, você pode autorizar por função ou por outras declarações.However, you can authorize by role or by other claims. Para obter mais informações, consulte autenticação e autorização na API Web.For more information, see Authentication and Authorization in Web API.
  5. Se as etapas anteriores forem bem-sucedidas, o controlador retorna o recurso protegido.If the previous steps are successful, the controller returns the protected resource. Caso contrário, o cliente recebe um erro de 401 (não autorizado).Otherwise, the client receives a 401 (Unauthorized) error.

Recursos adicionaisAdditional Resources