问题
In my asp.net core 2.0 solution I want to add Azure AD authentication. With the Azure AD templates inside of VS 2017 you either get JWTBearer authentication-implementation or OpenIdConnect implementation. Open Id also has the reputation of being more secure than OAuth.
How can I use Open ID / JWT with the Swagger Ui, provided by NSwag?
My current workaround would be to allow both OAuth and Open Id, but I need to implement that myself and there is almost no documentation on the new 2.0 APIs. Its also less secure having two authentication workflows. Especially when one is less secure than the other.
回答1:
Sample by renepape:
app.UseSwaggerUi(typeof(Startup).GetTypeInfo().Assembly, settings =>
{
settings.GeneratorSettings.OperationProcessors.Add(new OperationSecurityScopeProcessor("JWT Token"));
settings.GeneratorSettings.DocumentProcessors.Add(new SecurityDefinitionAppender("JWT Token",
new SwaggerSecurityScheme
{
Type = SwaggerSecuritySchemeType.ApiKey,
Name = "Authorization",
Description = "Copy 'Bearer ' + valid JWT token into field",
In = SwaggerSecurityApiKeyLocation.Header
}));
});
It works with UseSwaggerUi3
also.
回答2:
I'm using NSwag v13.0.6, and adding JWT support with UseSwaggerUi3
in Startup.Configure
(per the answer from @Der_Meister) no longer works.
Instead, I found I had to define the settings in the AddSwaggerDocument
call in Startup.ConfigureServices
:
// In the ConfigureServices method -- FWIW my app has this right after services.AddMvc()
services.AddSwaggerDocument(config => {
config.DocumentProcessors.Add(new SecurityDefinitionAppender("JWT Token",
new OpenApiSecurityScheme {
Type = OpenApiSecuritySchemeType.ApiKey,
Name = "Authorization",
Description = "Copy 'Bearer ' + valid JWT token into field",
In = OpenApiSecurityApiKeyLocation.Header
}));
});
Note:
- Add
using NSwag.Generation.Processors.Security
up top to resolveSecurityDefinitionAppender
- All other types resolve with
using NSwag
Then in Startup.Configure
all you need is this:
app.UseSwaggerUi3();
Actually my working code in Startup.Configure
differs slightly from the above because I use a custom swagger.json
(it's a project requirement):
// Required for serving up a static, hand-rolled JSON file for Swagger doc.
app.UseStaticFiles();
// Specify the custom JSON location.
app.UseSwaggerUi3(settings => settings.DocumentPath = "/swagger/v1/swagger.json");
My custom swagger.json
includes Bearer Authentication definitions. If you're letting NSwag generate the Swagger authentication definitions then your mileage may vary.
回答3:
The NSwag settings for the Swagger UI 2.x are very limited. First you need check how Swagger UI supports this and maybe you need to host Swagger UI yourself so that you can parametrize it more (and just generate the Swagger spec with NSwag).
In NSwag v11.7.2 you also have the option to use Swagger UI 3.x, maybe this is supported out-of-the-box in this version (UseSwaggerUi3()
).
来源:https://stackoverflow.com/questions/46236152/implement-jwtbearer-authentication-in-nswag-swaggerui