Como fazer autenticação CORS no WebAPI 2?

O cenário é simples, preciso efetuar login de outro servidor (diferente do servidor da API) para recuperar o token de access.

Eu instalei Microsoft.Owin.Cors pacote Microsoft.Owin.Cors no servidor de API. No arquivo Startup.Auth.cs , em public void ConfigureAuth(IAppBuilder app) , eu adicionei

 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

Em WebApiConfig.cs , em public static void Register(HttpConfiguration config) , adicionei nestas linhas:

 // Cors var cors = new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS"); config.EnableCors(cors); 

O que mais devo mudar?

Olha o que eu encontrei!

Adicione alguns headers personalizados dentro de .

       

Então eu posso fazer a autenticação CORS.

Eu tive muitas tentativas e erros para configurá-lo para o cliente web baseado em AngularJS.
Para mim, as abordagens abaixo funcionam com o ASP.NET WebApi 2.2 e o serviço baseado em OAuth.

  1. Instale Microsoft.AspNet.WebApi.Cors pacote nuget Microsoft.AspNet.WebApi.Cors .
  2. Instale Microsoft.Owin.Cors pacote nuget do Microsoft.Owin.Cors .
  3. Adicionar config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE")); para o acima de WebApiConfig.Register(config); linha no arquivo Startup.cs .
  4. Adicione app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); para o arquivo Startup.Auth.cs . Isso deve ser feito antes de chamar IAppBuilder.UseWebApi
  5. Remova qualquer configuração de xml que Blaise fez.

Eu encontrei muitas variações de configuração e combinações aqui stackoverflow ou artigos de blog . Então, a abordagem de Blaise pode ou não estar errada. São apenas outras configurações, eu acho.

Depois de muitas horas de pesquisa e olhando para muitas soluções diferentes para isso eu consegui obter este trabalho conforme a seguir.

Há várias razões para isso acontecer. Muito provavelmente você tem o CORS habilitado no lugar errado ou está habilitado duas vezes ou não.

Se estiver usando o ponto final do API da Web e do Token do Owin, será necessário remover todas as referências ao CORS no método da API da Web e adicionar o método owin correto, pois os api cors não funcionarão com o terminal Token, enquanto o Owin cors funcionará para o Web Pontos de extremidade de autenticação de API e token, então vamos começar:

  1. Certifique-se de ter instalado o pacote do Owin Cors. Remova qualquer linha que você tenha eg.config.EnableCors (); do seu arquivo WebAPIconfig.cs

  2. Vá para o seu arquivo startup.cs e certifique-se de executar o Owin Cors antes de qualquer outra execução de configuração.

    app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); ConfigureAuth (app);

  3. Se ainda tiver problemas, acesse: Startup.Auth.cs e verifique se você tem o seguinte em seu método ConfigureAuth (não é necessário se o arquivo startup.cs estiver correto)

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

web.config

      

Startup.cs

 var appSettings = WebConfigurationManager.AppSettings; // If CORS settings are present in Web.config if (!string.IsNullOrWhiteSpace(appSettings["cors:Origins"])) { // Load CORS settings from Web.config var corsPolicy = new EnableCorsAttribute( appSettings["cors:Origins"], appSettings["cors:Headers"], appSettings["cors:Methods"]); // Enable CORS for ASP.NET Identity app.UseCors(new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = request => request.Path.Value == "/token" ? corsPolicy.GetCorsPolicyAsync(null, CancellationToken.None) : Task.FromResult(null) } }); // Enable CORS for Web API config.EnableCors(corsPolicy); } 

Nota : app.UserCors(...) deve ser chamado antes de configurar o ASP.NET Identity.

Fonte: Kit de Iniciação de Aplicativos da Web do ASP.NET (ASP.NET Web API, Identity, SignalR)

Para elaborar a resposta do Youngjae, há um ótimo tutorial sobre como configurar o OWIN com a API da Web e ativar o CORS no processo em http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web- api-2-owin-asp-net-identity /

Você vai querer adicionar o pacote NuGet para o CORS com o comando:
Install-Package Microsoft.Owin.Cors -Version 2.1.0

Em seguida, adicione
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

para o seu método de configuração no Startup.cs, por isso parece algo como:

 public void Configuration(IAppBuilder app) { HttpConfiguration config = new HttpConfiguration(); ConfigureOAuth(app); WebApiConfig.Register(config); app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); app.UseWebApi(config); } 

A resposta para mim foi encontrada em

Pedido do CORS de comprovação de Web Api 2 para token de portador

Especificamente, a solicitação / Token usando uma implementação de OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials estava incluindo o header novamente. Adicione o material do OWIN CORS antes de qualquer outra configuração do OWIN e remova o header de GrantResourceOwnerCredentials, de acordo com esse link, e voila. Boa sorte.

Eu só quero compartilhar minha experiência. Passei metade do dia batendo com a cabeça e tentando fazer funcionar. Eu li vários artigos e perguntas do tipo e, no final, descobri o que estava errado.

A linha

 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

não foi o primeiro no método Configuration class Startup . Quando eu mudei para o topo – tudo começou a funcionar magicamente.

E sem headers personalizados em web.config ou config.EnableCors(corsPolicy); ou qualquer outra coisa era necessária.

Espero que isso ajude alguém a economizar algum tempo.

Você pode encontrar aqui as várias maneiras de ativar o CORS em diferentes escopos: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

De qualquer forma, tive o mesmo problema, e adicionando os headers de maneiras diferentes, não obtive a solução completa.

Descobri que o IIS usa manipuladores que substituem a configuração do aplicativo da Web CORS, caso você não especifique o contrário.

No meu caso, eu também tive que remover o uso de manipuladores do IIS adicionando a seguinte configuração no Web.config principal do meu aplicativo:

         

Esteja ciente de que esta configuração pode ser definida por padrão quando você cria um novo projeto, dependendo do tipo dele, mas se você começar do zero, você provavelmente terá que adicionar essa configuração.

A adição de headers de clientes pode não oferecer a você muita liberdade para personalizar suas necessidades de segurança. Ele abre todas as outras partes da API para o mundo. O código a seguir só faz isso para “token” e o controlador outra parte da API deve ser feito via anotação EableCors.

 public void ConfigureAuth(IAppBuilder app) { //other stuff app.Use(async (context, next) => { IOwinRequest req = context.Request; IOwinResponse res = context.Response; if (req.Path.StartsWithSegments(new PathString("/Token"))) { var origin = req.Headers.Get("Origin"); if (!string.IsNullOrEmpty(origin)) { res.Headers.Set("Access-Control-Allow-Origin", origin); } if (req.Method == "OPTIONS") { res.StatusCode = 200; res.Headers.AppendCommaSeparatedValues("Access-Control- Allow-Methods", "GET", "POST"); res.Headers.AppendCommaSeparatedValues("Access-Control- Allow-Headers", "authorization", "content-type"); return; } } await next(); }); //other stuff } 

Para ativar Cors, siga as instruções aqui .

Ao usar o middleware OWIN para manipular o CORS, não precisamos adicionar headers no WebAPIConfig ou no arquivo web.config. Sim, adicionar os headers no arquivo web.config funciona quando você deseja access público, mas se precisar limitar o access com base em uma lista de desbloqueio (domínios), permitir que o access Todos não seja mais o que você gostaria de fazer.

Com o OWINS, podemos lidar com isso implementando esse manipulador:

 OAuthAuthorizationServerProvider.MatchEndpoint 

Com esse manipulador, podemos detectar o método de solicitação (OPTIONS, POST …) e se a solicitação deve ser tratada como um endpoint Authorize ou Token. Esta é a área em que a lógica pode ser adicionada para verificar o header Origem (solicitação) e validar se esse domínio deve ser permitido adicionando o header de resposta Access-Control-Allow-Origin.

 string origin = context.Request.Headers.Get("Origin"); var found = IsDomainAllowed(origin); if (found){ context.Response.Headers.Add("Access-Control-Allow-Origin", new string[] { origin }); } 

Para mais informações sobre isso, veja este link: http://www.ozkary.com/2016/04/web-api-owin-cors-handling-no-access.html

Solucao Completa. Você só precisa alterar alguns arquivos, funciona para mim.

Global.ascx

 public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { WebApiConfig.Register(GlobalConfiguration.Configuration); } } 

WebApiConfig.cs

Todo o pedido tem chamado esse código.

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { EnableCrossSiteRequests(config); AddRoutes(config); } private static void AddRoutes(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "Default", routeTemplate: "api/{controller}/" ); } private static void EnableCrossSiteRequests(HttpConfiguration config) { var cors = new EnableCorsAttribute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors); } } 

Algum controlador

Nada a mudar.

Web.config

Você precisa adicionar manipuladores em seu web.config