2017-06-17 4 views
1

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

Antwort

0

Für alle jemals das gleiche Problem zu begegnen. Ich habe es irgendwann herausgefunden. Arbeitete wie ein Zauber, aber die HSTS-Richtlinie für die Domäne, die ich für meine virtuelle Anwendung konfiguriert hatte, leitete den gesamten http-Postman-Verkehr automatisch auf https um. Die Anwendung wurde auf einer einfachen Domäne ohne SSL installiert und auf dieser Domäne wurde SSL perfekt erzwungen. Seufzer :)

Verwandte Themen