#c# #swagger #.net-core #identityserver4 #swashbuckle
#c# #swagger #.net-ядро #identityserver4 #swashbuckle
Вопрос:
В настоящее время у меня возникают проблемы с использованием swagger для авторизации вызова API на сервере идентификации 4.
Моя зависимость от swagger использует клиентскую версию swashbuckle -бета-объект на сервере идентификации 4 выглядит следующим образом
new Client
{
ClientId="swagger",
Enabled = true,
ClientName="Swagger",
AllowedGrantTypes = GrantTypes.Implicit,
ClientSecrets = new List<Secret>
{
new Secret("secret".Sha256())
},
AllowedScopes = new List<string>
{
"apil"
},
RedirectUris = new List<string>
{
"http://localhost:15138/swagger/ui/popup.html"
},
AllowedCorsOrigins = new List<string>
{
"http://localhost:15138",
"http://localhost:15138"
},
AllowAccessTokensViaBrowser = true,
AllowAccessToAllScopes= true
}
Клиентский объект — это модель сервера идентификации 4
в методе настройки для аутентификации, у меня есть это
app.UseIdentityServer();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = "http://localhost:15138/",
ScopeName = "apil",
RequireHttpsMetadata = false,
});
С помощью fiddler мой запрос get выглядит следующим образом
ПОЛУЧИТЬ /connect/authorize?state=9321480892748389amp;nonce=5279296493808222amp;client_id=swaggeramp;redirect_uri=http://localhost:15138/swagger/ui/popup.htmlamp;response_type=id_token tokenamp;scope= apil HTTP/1.1
Все необходимые параметры есть, у клиента есть соответствующий идентификатор клиента, но ответ, который я получаю, — это перенаправление на страницу с ошибкой с сообщением о недопустимом запросе. Я ожидал, что страница входа в систему передаст учетные данные или что-то подобное для авторизации, мне было интересно, что я сделал не так, чтобы это произошло.
Ответ №1:
Я столкнулся с той же проблемой, и это было связано с несколькими разными вещами.
-
Swagger необходимо настроить определение безопасности.
-
Автоматическая проверка подлинности IdentityServerAuthentication должна быть true.
-
Идентификатор клиента Swagger и имя клиента должны быть настроены в Startup.cs.
Смотрите ниже:
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c => {
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "my api title",
Description = "my api desc",
TermsOfService = "None",
Contact = new Contact { Name = "contact" }
});
var filePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "api.xml");
c.IncludeXmlComments(filePath);
c.AddSecurityDefinition("oauth2", new OAuth2Scheme
{
Type = "oauth2",
Flow = "implicit",
AuthorizationUrl = "https://url",
Scopes = new Dictionary<string, string>
{
{ "api-name", "my api" }
}
});
});
}
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseIdentity();
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = "https://url",
RequireHttpsMetadata = true,
ApiName = "api-name",
ApiSecret = "api-secret",
AllowedScopes = { "api-name", "openid", "email", "profile" },
ClaimsIssuer = "https://url",
AutomaticAuthenticate = true,
});
app.UseStaticFiles();
app.UseMvc();
// Enable middleware to serve generated Swagger as a JSON endpoint
app.UseSwagger();
// Enable middleware to serve swagger-ui assets (HTML, JS, CSS etc.)
app.UseSwaggerUi(c =>
{
c.ConfigureOAuth2("swagger-name", "swagger-secret", "swagger-realm", "Swagger");
});
}