2016-08-05 4 views

Antwort

16

kämpfte ich mit dem gleichen Problem und eine funktionierende Lösung in diesem Blogpost gefunden: http://blog.sluijsveld.com/28/01/2016/CustomSwaggerUIField

Es kommt auf diese in Ihrem configurationoptions zum Hinzufügen

services.ConfigureSwaggerGen(options => 
{ 
    options.OperationFilter<AuthorizationHeaderParameterOperationFilter>(); 
}); 

und der Code für die operationfilter

public class AuthorizationHeaderParameterOperationFilter : IOperationFilter 
{ 
    public void Apply(Operation operation, OperationFilterContext context) 
    { 
     var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors; 
     var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is AuthorizeFilter); 
     var allowAnonymous = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter); 

     if (isAuthorized && !allowAnonymous) 
     { 
      if (operation.Parameters == null) 
      operation.Parameters = new List<IParameter>(); 

      operation.Parameters.Add(new NonBodyParameter 
      {      
      Name = "Authorization", 
      In = "header", 
      Description = "access token", 
      Required = true, 
      Type = "string" 
     }); 
     } 
    } 
} 

Dann sehen Sie eine zusätzliche Autorisierung TextBox in Ihrem Swagger, wo Sie Ihre Toke hinzufügen können n im Format 'Bearer {jwttoken}' und Sie sollten in Ihren Swagger-Anfragen autorisiert sein.

+0

, wo Sie die Inhaber Token erhalte in das jwttoken Feld zu setzen, wenn die Funktionalität in ui Prahlerei mit ausprobieren? – emseetea

+0

Nur ein schneller Helfer; mit Microsoft.AspNetCore.Mvc.Authorization; mit Swashbuckle.AspNetCore.Swagger; mit Swashbuckle.AspNetCore.SwaggerGen; mit System.Collections.Generic; mit System.Linq; – statler

2

Um auf HansVG Antwort zu erweitern, die für mich arbeitete (danke) und da ich nicht genug Beitragspunkte habe, kann ich emseetea Frage nicht direkt beantworten. Sobald Sie das Autorisierungs-Textfeld haben, müssen Sie den Endpunkt anrufen, der das Token generiert, das außerhalb Ihres Bereichs [Authorize] von Endpunkten liegt.

Sobald Sie diesen Endpunkt zum Generieren des Tokens vom Endpunkt aufgerufen haben, können Sie es aus den Ergebnissen für diesen Endpunkt kopieren. Dann haben Sie das Token in Ihren anderen Bereichen zu verwenden, die [Autorisieren] sein müssen. Fügen Sie es einfach in das Textfeld ein. Stellen Sie sicher, dass, wie HansVG erwähnt, es im richtigen Format, das "Bearer" enthalten muss, hinzugefügt wird. Format = "Träger {Token}".

1

Momentan hat Swagger Funktionalität für die Authentifizierung mit JWT-Token und kann automatisch Token in den Header hinzufügen (ich benutze Swashbuckle.AspNetCore 1.1.0).

enter image description here

Der folgende Code sollte dazu beitragen.

In der Startup.ConfigureServices():

services.AddSwaggerGen(c => 
{ 
    // Your custom configuration 
    c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" }); 
    c.DescribeAllEnumsAsStrings(); 
    // JWT-token authentication by password 
    c.AddSecurityDefinition("oauth2", new OAuth2Scheme 
    { 
     Type = "oauth2", 
     Flow = "password", 
     TokenUrl = Path.Combine(HostingEnvironment.WebRootPath, "/token"), 
     // Optional scopes 
     //Scopes = new Dictionary<string, string> 
     //{ 
     // { "api-name", "my api" }, 
     //} 
    }); 
}); 

überprüfen und konfiguriert TokenUrl wenn Ihr Endpunkt unterschiedlich ist.

Im Startup.Configure():

app.UseSwagger(); 
app.UseSwaggerUI(c => 
{ 
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "API V1"); 
    // Provide client ID, client secret, realm and application name (if need) 
    c.ConfigureOAuth2("swagger-ui", "swagger-ui-secret", "swagger-ui-realm", "Swagger UI"); 
}); 

Wenn Ihr Endpunkt für die Authentifizierung durch Token, um den Standard OAuth2 folgt, sollte funktionieren. Aber nur für den Fall habe ich Probe dieses Endpunkt hinzugefügt:

public class AccountController : Controller 
{ 
    [ProducesResponseType(typeof(AccessTokens), (int)HttpStatusCode.OK)] 
    [ProducesResponseType((int)HttpStatusCode.BadRequest)] 
    [ProducesResponseType((int)HttpStatusCode.Unauthorized)] 
    [HttpPost("/token")] 
    public async Task<IActionResult> Token([FromForm] LoginModel loginModel) 
    { 
     switch (loginModel.grant_type) 
     { 
      case "password": 
       var accessTokens = // Authentication logic 
       if (accessTokens == null) 
        return BadRequest("Invalid user name or password."); 
       return new ObjectResult(accessTokens); 

      case "refresh_token": 
       var accessTokens = // Refresh token logic 
       if (accessTokens == null) 
        return Unauthorized(); 
       return new ObjectResult(accessTokens); 

      default: 
       return BadRequest("Unsupported grant type"); 
     } 
    } 
} 

public class LoginModel 
{ 
    [Required] 
    public string grant_type { get; set; } 

    public string username { get; set; } 
    public string password { get; set; } 
    public string refresh_token { get; set; } 
    // Optional 
    //public string scope { get; set; } 
} 

public class AccessTokens 
{ 
    public string access_token { get; set; } 
    public string refresh_token { get; set; } 
    public string token_type { get; set; } 
    public int expires_in { get; set; } 
} 
+0

Dies funktioniert, außer wenn UserId/Password/Client/Secret fehlgeschlagen ist, ist es einfach im Hintergrund gescheitert und zeigt immer noch angemeldet an. – Whoever

+0

Überprüfen Sie, ob Sie den HTTP-Statuscode 400 zurückgeben, wenn die Autorisierung fehlgeschlagen ist. Es ist Anforderung von RFC 6749 und Swagger auch verarbeiten. Ich habe die Antwort aktualisiert. –

+0

Ja, ich benutze IdentityServer 4 und es gibt 400 zurück. Aber Swagger UI zeigt Abmelde-Button, als ob Benutzer sich erfolgreich angemeldet hat. Ich bin mir nicht sicher, wie man diesen Swagger-Popup-Bildschirm konfiguriert, um die Authentifizierung fehlgeschlagen zu zeigen. – Whoever