Zajmuję się tworzeniem interfejsu API sieci Web z .Net core 3.0 i chcę zintegrować go z SwashBuckle.Swagger. Działa dobrze, ale po dodaniu uwierzytelnienia JWT nie działa zgodnie z oczekiwaniami. Aby to zrobić, dodałem poniższy kod:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "My Web API", Version = "v1" });
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey
});
});
Po dodaniu AddSecurityDefinition
funkcji widzę przycisk Autoryzuj, a kiedy go klikam, widzę poniższy formularz:
Następnie piszę: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh
Po zrobieniu tego spodziewam się zobaczyć authorization: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh
w nagłówku żądania, kiedy wysyłam żądanie do interfejsu API sieci Web od Swagger. Ale autoryzacja nie jest dodawana do nagłówka żądania. Używam SwashBuckle.Swagger (5.0.0-rc3). Należy pamiętać, że istnieje wiele próbek, które działają dobrze na .net core 2.0, ale funkcje swashger Swashbuckle zmieniły się w najnowszej wersji, więc nie mogę używać tych próbek.
źródło
.AddSecurityRequirement
(globalnie) lub.Security
(na poziomie operacyjnym) - jak wyjaśniono w odpowiedziach na powiązane pytanie.AddSecurityDefinition
sam nie wystarczy.Odpowiedzi:
Po kilku badaniach w końcu znalazłem tutaj odpowiedź
Przed obejrzeniem tej strony wiedziałem, że powinienem użyć
AddSecurityRequirement
później zAddSecurityDefinition
powodu wielu próbek, ale problem polegał na zmianie parametrów funkcji w .NET Core 3.0.Nawiasem mówiąc, ostateczna odpowiedź jest następująca:
źródło
Jeśli używasz Swagger 3.0, ma on wbudowaną obsługę uwierzytelniania JWT.
Musisz użyć ParameterLocation.Header, SecuritySchemeType.Http, nośnika i JWT w OpenApiSecurityScheme, jak pokazano poniżej.
Po tym nie będziesz musiał określać tokena w formacie nośnika {token} . Podaj tylko token, a schemat bezpieczeństwa zastosuje go automatycznie w nagłówku.
źródło
Jeśli nie chcesz ręcznie dodawać tokena i chcesz, aby zakresy były wybierane wraz z przekazaniem clientId do serwera tożsamości, możesz dodać coś takiego.
Użyłem niejawnego przepływu, ale możesz skonfigurować dowolny przepływ za pomocą następującego mechanizmu:
Wynik będzie taki:
źródło
Oto zaktualizowane rozwiązanie dla Swashbuckle.AspNetCore 5.3.2, zintegrowane z IdentityServer4, z interfejsem API zabezpieczonym za pomocą tokena elementu nośnego.
W
ConfigureServices()
metodzie:W
Configure()
metodzie:źródło
Jeśli ktoś używa NSwag i wylądował tutaj po przeszukaniu rozwiązania, oto link z oficjalnej dokumentacji.
NSwag Włącz uwierzytelnianie JWT
PS: Wiem, że pierwotne pytanie dotyczyło SwashBuckle, ale Google pokazuje ten link również podczas wyszukiwania NSwag.
źródło