OWIN jeton d'authentification 400 Bad Request sur les OPTIONS du navigateur
Je suis à l'aide jeton d'authentification pour les petits du projet sur la base de cet article: http://bitoftech.net/2014/06/09/angularjs-token-authentication-using-asp-net-web-api-2-owin-asp-net-identity/
Tout semble bien fonctionner sauf une chose: OWIN jeton d'authentification n'autorise pas les OPTIONS de demande sur /jeton de point de terminaison. Web API retourne 400 Bad Request et l'ensemble de l'application navigateur envoie une requête POST à obtenir un jeton.
J'ai tous de la SCRO activée dans l'application, comme dans l'exemple de projet. Ci-dessous un code qui pourrait être pertinente:
public class Startup
{
public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
public void Configuration(IAppBuilder app)
{
AreaRegistration.RegisterAllAreas();
UnityConfig.RegisterComponents();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
HttpConfiguration config = new HttpConfiguration();
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseWebApi(config);
Database.SetInitializer(new ApplicationContext.Initializer());
}
public void ConfigureOAuth(IAppBuilder app)
{
//use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60),
Provider = new SimpleAuthorizationServerProvider(),
RefreshTokenProvider = new SimpleRefreshTokenProvider()
};
//Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(OAuthBearerOptions);
}
}
Ci-dessous est ma fonction de connexion à partir de javascript (je suis en utilisant angularjs pour cela)
var _login = function (loginData) {
var data = "grant_type=password&username=" + loginData.userName + "&password=" + loginData.password;
data = data + "&client_id=" + ngAuthSettings.clientId;
var deferred = $q.defer();
$http.post(serviceBase + 'token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (response) {
localStorageService.set('authorizationData', { token: response.access_token, userName: loginData.userName, refreshToken: response.refresh_token, useRefreshTokens: true });
_authentication.isAuth = true;
_authentication.userName = loginData.userName;
_authentication.useRefreshTokens = loginData.useRefreshTokens;
deferred.resolve(response);
}).error(function (err, status) {
_logOut();
deferred.reject(err);
});
return deferred.promise;
};
var _logOut = function () {
localStorageService.remove('authorizationData');
_authentication.isAuth = false;
_authentication.userName = "";
_authentication.useRefreshTokens = false;
};
Vous devez vous connecter pour publier un commentaire.
J'ai perdu un peu de temps sur ce problème aujourd'hui. Enfin, je crois que j'ai trouvé une solution.
Remplacer la méthode à l'intérieur de votre OAuthAuthorizationServerProvider:
Cela semble faire trois choses:
Access-Control-Allow-Origin
Authorization
- tête pour être fixé sur les demandes ultérieures par la mise enAccess-Control-Allow-Headers
Après ces étapes angulaire enfin se comporte correctement lors de la demande de jeton de point de terminaison avec la méthode des OPTIONS. OK statut est renvoyé, et il se répète de la requête avec la méthode POST pour obtenir la pleine un jeton de données.
Remplacer cette méthode à l'intérieur de votre
OAuthAuthorizationServerProvider
:Êtes-vous d'exécuter localement ou publiez vous d'Azur comme dans l'article du blog de l'exemple de code?
Si vous êtes en cours d'exécution sur Azure, vous pouvez résoudre facilement les problèmes de la SCRO par l'activation de la SCRO dans le portail Azure:
Ce fixe les OPTIONS de contrôle en amont problème pour moi, qui, quelques autres personnes semblent avoir eu sur le code dans cet article de blog.
Résolu. Le problème n'était pas d'envoi avec des OPTIONS d'en-tête de demande de Contrôle d'Accès-Demande-Méthode
Cela devrait faire l'affaire: