OWIN-token-Authentifizierung 400 Bad Request auf OPTIONEN aus dem browser
Ich bin mit token-Authentifizierung für kleine Projekt basierend auf diesem Artikel: http://bitoftech.net/2014/06/09/angularjs-token-authentication-using-asp-net-web-api-2-owin-asp-net-identity/
Scheint alles zu funktionieren, außer eine Sache: OWIN basiert token-Authentifizierung nicht zulassen OPTIONEN auf Anfrage /token-Endpunkt. Web-API gibt 400 Bad Request und die gesamte browser-app Stoppt das senden von POST-Requests zu erhalten token.
Habe ich alle CORS aktiviert in der Anwendung wie im Beispiel-Projekt. Nachfolgend einige code, der relevant sein könnte:
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);
}
}
Unten ist mein login-Funktion von javascript (ich bin mit angularjs für diesen Zweck)
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;
};
InformationsquelleAutor VsMaX | 2014-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe einige Zeit an diesem problem heute. Schließlich denke ich, dass ich eine Lösung gefunden habe.
Override-Methode in Ihrem OAuthAuthorizationServerProvider:
Scheint dies zu tun, drei Dinge notwendig:
Access-Control-Allow-Origin
Authorization
- header festgelegt werden, die nachfolgende Anforderungen durch EinstellungAccess-Control-Allow-Headers
Nachdem diese Schritte Winkel-schließlich verhält sich korrekt, wenn Sie die Anfrage-token-Endpunkt mit OPTIONEN Methode. Der OK-status zurückgegeben, und es wiederholt die Anfrage mit der Methode POST voll zu bekommen-token-Daten.
danke @knr, deine Lösung funktioniert auch bei mir.
InformationsquelleAutor
Überschreiben Sie diese Methode in Ihrem
OAuthAuthorizationServerProvider
:InformationsquelleAutor
Sind Sie es lokal oder veröffentlichen Sie es auf Azure-wie im blog-Artikel Beispielcode?
Wenn Sie es läuft auf Azure können Sie ganz einfach fix CORS Probleme durch die Aktivierung von CORS in das Azure portal:
Diese Feste die OPTIONEN preflight-check problem für mich, das ein paar andere Leute zu haben scheinen, hatte aus dem code in diesem bestimmten blog-Artikel.
InformationsquelleAutor
Gelöst. Das problem war nicht das senden mit OPTIONEN request-header Access-Control-Request-Methode
Gleiche problem hier. Und ich habe immer noch nicht verstanden, wie dieses Problem zu lösen.
Ich wäre schön gewesen, wenn Sie ausgearbeitet, wie Sie das Problem gelöst.. ich habe es gelöst mit der Lösung, die durch @knr
🙂 Schöne Lösung.. aber wie ?
InformationsquelleAutor
Dies sollte den trick tun:
InformationsquelleAutor