2017-11-03 8 views
3

Ich möchte den Zugriff auf swagger-ui und Metadaten nur erlauben, wenn der Benutzer in unserer Web-App authentifiziert ist (forms auth), aber ich möchte den API-Zugriff jederzeit erlauben (API hat einige öffentliche Methoden und einige, die grundlegende Auth erfordern).ServiceStack API-Dokumentation in Swagger-UI hinter den geschlossenen Türen

Also, was ich tat, das ich diesen Weg Präfix für API hinzugefügt:

public override RouteAttribute[] GetRouteAttributes(Type requestType) 
{ 
    var routes = base.GetRouteAttributes(requestType); 
    routes.Each(x => x.Path = "/API" + x.Path); 
    return routes; 
} 

Und:

ServiceRoutes = new Dictionary<Type, string[]> { 
{ 
     typeof(AuthenticateService), new[] { "/api/auth", "/api/auth/{provider}" } 
    }, 
} 

Und diese auch in Web-config:

<location path="api"> 
<system.web> 
    <authorization> 
    <allow users="*"/> 
    </authorization> 
</system.web> 

Und die Sache ist, dass whe n Ich gehe jetzt zu /api/, das funktioniert gut, aber wenn ich versuche, eine Methode aufzurufen, bekomme ich reddirected auf meine login Route.

Gibt es eine Möglichkeit, dies zu lösen, wie ich es begonnen habe, oder gibt es eine bessere Möglichkeit, die Dokumentation zu schützen?

Antwort

2

Es gibt keine explizite Option Authentifizierung auf Metadaten-Seiten benötigen aber einen PreRequestFilter kann mit Zugang zu den /metadata und /swagger-ui Seiten zu schützen:

PreRequestFilters.Add((req, res) => 
{ 
    if (req.PathInfo.StartsWith("/metadata") || req.PathInfo.StartsWith("/swagger-ui")) 
    { 
     var session = req.GetSession(); 
     if (!session.IsAuthenticated) 
     { 
      res.StatusCode = (int)HttpStatusCode.Unauthorized; 
      res.EndRequest(); 
     } 
    } 
}); 

Und wenn Sie Zugriff auf die /openapi JSON-Spezifikation zu schützen‘ re Swagger 2.0/Open API Feature verwenden, können Sie dynamisch das [Authenticate] Attribut zur Laufzeit mit hinzuzufügen:

public AppHost() 
{ 
    typeof(OpenApiService) 
     .AddAttributes(new AuthenticateAttribute()); 
} 

Wenn Sie den älteren verwenden Swagger 1.2 Plugin können Sie den Zugriff auf Backend-Services schützen mit:

public AppHost() 
{ 
    typeof(SwaggerResource) 
     .AddAttributes(new AuthenticateAttribute()); 
    typeof(SwaggerResources) 
     .AddAttributes(new AuthenticateAttribute()); 
} 

Dies setzt voraus, Sie verwenden ServiceStack Authentication nicht ASP.NET Auth.

+0

Super, danke. – ShP

+0

Eine weitere Frage: Ich habe meine App auf der https-Site bereitgestellt, so dass sie wie folgt aussieht: https: // example.com/mywebapp/swagger-ui /, aber sie leitet weiter um: https://example.com: 8443/swagger-ui/'(also den Port hinzufügen und entfernen Sie den Teil, wo die App tatsächlich sitzt), warum ist das? Wenn ich es lokal ausführe funktioniert es gut ... – ShP

+0

@ShP Da Sie einen Proxy durchlaufen und die generierte URL auf der eingehenden Anfrage basiert. Sie können 'Config.WebHostUrl' einstellen, um festzulegen, welche externe URL Sie stattdessen verwenden möchten. – mythz