Hoffe, dass jemand mir mit dem folgenden sehr frustrierenden Problem helfen kann.Token-Endpunkt mit AllowInsecureHttp = false akzeptiert immer noch HTTP-Anfragen
Ich habe .NET WebApi, die ich mit JWT-Authentifizierung gesichert habe. Bei der Einrichtung des OAuthAuthorizationServerOptions
-Objekts habe ich die Eigenschaft AllowInsecureHttp
für meinen Token-Endpunkt auf false
gesetzt. Das Ausführen meiner API lokal auf IISExpress und das Testen mit Postman funktioniert wie ein Zauber. Wenn ich die Eigenschaft auf true
setze und nach einem Token an meinem Endpunkt frage, funktioniert es, wenn ich es auf false
setze, bekomme ich einen 404
wie erwartet. Aber wenn ich die API in meiner Produktionsumgebung (Windows 2012/IIS8) veröffentliche und die Eigenschaft auf false
setze, kann ich ein Token über beide HTTPS und http erhalten. Es scheint einfach nicht auf das Grundstück zu hören.
Ich führe die API als eine Anwendung mit Alias Api unter einer Domäne mit nur einer https-Bindung. Ich verwende die folgenden Helfer Basisklasse für meine API:
public class BaseWebApi<TDerivedOAuthProvider> where TDerivedOAuthProvider : BaseOAuthProvider, new()
{
public BaseWebApi(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(DefaultAuthenticationTypes.ExternalBearer));
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
private static void ConfigureOAuth(IAppBuilder app)
{
var allowInsecureHttp = Convert.ToBoolean(ConfigurationManager.AppSettings["jwt::allowInsecureHttp"].ToString());
var issuer = ConfigurationManager.AppSettings["jwt::issuer"].ToString();
var secret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["jwt::secret"].ToString());
var clients = ConfigurationManager.AppSettings["jwt::clients"].ToString().Split(new char[] { ',' });
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = allowInsecureHttp,
AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(10),
Provider = new TDerivedOAuthProvider(),
RefreshTokenProvider = new BaseRefreshTokenProvider(),
AccessTokenFormat = new BaseJwtFormat(issuer),
};
// OAuth 2.0 Bearer Access Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
// Api controllers with an [Authorize] attribute will be validated with JWT
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = clients,
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
}
});
}
}
Variablen allowInsecureHttp
, issuer
, secret
und clients
wird aus einer Konfigurationsdatei gefüllt. Wenn Sie den Wert allowInsecureHttp
auf false
oder true
fest codieren, ändert sich nichts. Diese Basisklasse wird dann durch meine eigentliche API, die (neben den eigentlichen API-Funktionen) instanziiert auch eine CustomOAuthProvider
Klasse die tatsächliche Umsetzung des Berechtigungsnachweises für dieses spezielle API Überprüfung der Handhabung:
[assembly: OwinStartup(typeof(MyCustomAPI.Startup))]
namespace MyCustomAPI.API
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
BaseWebApi<CustomOAuthProvider> webApi = new BaseWebApi<CustomOAuthProvider>(app);
}
}
}
Hoffnung jemand kann mich zeigen in die richtige Richtung. Abgesehen von diesem Problem funktioniert die API selbst einwandfrei, aber ich möchte wirklich SSL auf meine Produktionstoken erzwingen.
Cheers, Nyquist