Dans mon application, j'utilise une API Web avec une authentification basée sur un jeton avec le support CORS, mais lorsque la demande client du jeton a été générée, une erreur est survenue en raison de la demande CORS (demande croisée d'origine: la règle d'origine identique interdit la lecture de la ressource distante sur (mon site Ceci peut être corrigé en déplaçant la ressource dans le même domaine ou en activant CORS.)
J'avais configuré tout le nécessaire pour le support CORS (je pense que oui). voici ma configuration
Owin classe de démarrage
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration
{
DependencyResolver = new StructureMapWebApiDependencyResolver(container)
};
WebApiConfig.Register(config); // registering web api configuration
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); // cors for owin token pipeline
app.UseWebApi(config);
ConfigureOAuth(app);
}
public void ConfigureOAuth(IAppBuilder app)
{
var oAuthAuthorizationServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthAuthorizationServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
Et ma configuration webapi
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.EnableCors(); // Corse support for Web api
config.MapHttpAttributeRoutes(); // attribute based urls
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
ici la configuration dans web.config
<system.webserver>
<httpProtocol>
<customHeaders>
<!-- Adding the following custom HttpHeader will help prevent CORS from stopping the Request-->
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</customHeaders>
</httpProtocol>
</system.webserver>
et mon en-tête de demande de mozilla
Accept application/json, text/plain, */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length 67
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Host talenterp
Origin http://192.168.1.11:85
Referer http://192.168.1.11:85/
User-Agent Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Les URL des applications sont
Application serveur (qui devrait prendre en charge CORS)
{http://talenterp}
Point d'arrivée du jeton:
{http://talenterp/token}
Application client
{http://talentmvc:85}
NB: j'ai déjà ajouté
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
dans la méthode GrantResourceOwnerCredentials () de mon AuthorizationServerProvider
Assurez-vous que vous avez seulement
app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll);
configuré, et pas aussi l'ancien style 'config.EnableCors ()' dans votre Global.asax ou WebApiConfig. En outre: placez la déclaration ci-dessus en premier dans votre classe de démarrage owin . Oui, cela fait vraiment une différence. Si vous le réglez plus tard, les cors risquent de ne pas fonctionner.
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
... etc
OWIN et Microsoft.AspNet.WebApi.Cors sont deux bibliothèques distinctes, chacune d’elles ayant besoin d’une configuration distincte.
Désactiver l'utilisation de CORS avec OWIN:
public void Configuration(IAppBuilder app)
{
//app.UseCors(CorsOptions.AllowAll);
Recherchez la méthode GrantResourceOwnerCredentials et ajoutez Access-Control-Allow-Origin au contexte afin que, lorsqu'il renvoie un appel une fois l'authentification terminée, ce navigateur trouve l'en-tête et l'accepte.
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" });
Maintenant, installez le paquet Microsoft.AspNet.WebApi.Cors à partir de Nuget dans votre projet webapi et ajoutez-le à la méthode Register
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://localhost, ", "accept,accesstoken,authorization,cache-control,pragma,content-type,Origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS");
config.EnableCors(cors);
Cela l'a fait pour moi.
Surtout si vous rencontrez des problèmes avec le jeton porteur Web API lorsque vous utilisez CORS, n'oubliez pas de mettre "TOKEN" dans la liste de vos méthodes autorisées.
S'il vous plaît mettez le code dans votre system.webServer de web.config, c'est comment j'ai résolu le mien
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE, TOKEN" />
</customHeaders>