ОБНОВЛЕНИЕ 2: если я изменю тег авторизации контроллера с этого
[Authorize]
к этому
[Authorize(Roles = "Read")]
затем я получаю флажок для выбора области, а запрос токена ajax содержит правильную область и успешно завершается. Однако я все еще получаю красный восклицательный знак. Похоже, Swagger или Swashbuckle требует, чтобы роли соответствовали определениям области действия? Можно ли использовать поток приложения без определенных ролей при использовании Swashbuckle? И если да, то как заставить это работать? Должен ли я вручную устанавливать область действия в классе фильтра операций? Если невозможно использовать Swashbuckle без перечисления ролей в теге авторизации, мне нужно знать, как назначать роли клиентов в IdentityServer3.
ОБНОВЛЕНИЕ 3. Если я изменю фильтр операций на что-то подобное, появится область, но после выбора области и нажатия на «Авторизовать» страница просто перезагрузится. Сначала была успешно отправлена авторизация ajax.
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var scopes = new List<string>() { "Read" };
if (scopes.Any())
{
if (operation.security == null)
operation.security = new List<IDictionary<string, IEnumerable<string>>>();
var oAuthRequirements = new Dictionary<string, IEnumerable<string>>
{
{ "oauth2", scopes }
};
operation.security.Add(oAuthRequirements);
}
}
Исходное сообщение. Я пытаюсь настроить Swashbuckle, чтобы клиенты могли тестировать службу REST, защищенную потоком учетных данных клиента OAuth2. Переключатель никогда не появляется на странице, не так ли? но я вижу красный кружок с восклицательным знаком, говорящий мне, что ресурс не защищен. Я использую пакет Nuget Swashbuckle.Core версии 5.4.0. Ответ здесь Включить поток учетных данных клиента Oauth2 в Swashbuckle, похоже, следует за тем, что Я сделал и использовал класс AssignOAuth2SecurityRequirements дословно. Я не вставлял javascript и не думаю, что должен, поскольку моя схема авторизации довольно стандартна. Когда я удаляю ключевое слово Authorize на контроллере, у этого метода больше нет красного восклицания в пользовательском интерфейсе Swagger, что, как я надеюсь, означает, что я близок, но я не нахожу недостающую ссылку. Поскольку этот поток является «приложением», и у меня есть только одна область, я хотел убедиться, что она выглядит правильно настроенной и clientSecret загружен в нужное место.
ОБНОВЛЕНИЕ 1 Я смог отладить вызов AJAX и вижу, что область действия не задана и поэтому не отправлена в запросе. Почему не устанавливается область действия? Почему у меня нет флажка для выбора области?
Вот мой SwaggerConfig.cs
public class SwaggerConfig
{
public static void Register()
{
var thisAssembly = typeof(SwaggerConfig).Assembly;
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "waRougeOneApp");
c.OAuth2("oauth2")
.Description("OAuth2 Client Credentials Grant Flow")
.Flow("application")
.TokenUrl("https://securitydev.rougeone.com/core/connect/token")
.Scopes(scopes =>
{
scopes.Add("Read", "Read access to protected resources");
});
c.IncludeXmlComments(GetXmlCommentsPath());
c.UseFullTypeNameInSchemaIds();
c.DescribeAllEnumsAsStrings();
c.OperationFilter<AssignOAuth2SecurityRequirements>();
})
.EnableSwaggerUi(c =>
{
c.EnableOAuth2Support(
clientId: "client_id",
clientSecret: "client_secret",
realm: "swagger-realm",
appName: "Swagger UI"
);
});
}
protected static string GetXmlCommentsPath()
{
return System.String.Format(@"{0}bin\\waRougeOne.xml", System.AppDomain.CurrentDomain.BaseDirectory);
}
}
А класс AssignOAuth2SecurityRequirements -
public class AssignOAuth2SecurityRequirements : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var authorized = apiDescription.ActionDescriptor.GetCustomAttributes<AuthorizeAttribute>();
if (!authorized.Any()) return;
if (operation.security == null)
operation.security = new List<IDictionary<string, IEnumerable<string>>>();
var oAuthRequirements = new Dictionary<string, IEnumerable<string>>
{
{"oauth2", Enumerable.Empty<string>()}
};
operation.security.Add(oAuthRequirements);
}
}
Я безуспешно пытался найти рабочий пример с потоком учетных данных клиента, поэтому я не уверен на 100%, что увижу кнопку переключения, когда все работает правильно. В примерах для неявного потока, если вы наведете курсор на красный восклицательный круг, вы увидите перечисленные типы грантов, щелчок по красному восклицательному кругу покажет варианты для перечисленных областей, в которых вы выбираете один, а затем нажимаете авторизовать, и он возвращается с синий восклицательный знак.
У меня никогда не было флажка для выбора области действия, но я определил только одну область. Что я делаю неправильно? Я обнаружил это при отладке swagger ui JavaScript, который, кажется, указывает на наличие всех необходимых данных?
authorizations
:
null
auths
:
Array[1]
0
:
Object
name
:
"oauth2"
type
:
"oauth2"
value
:
Object
description
:
"OAuth2 Client Credentials Grant Flow"
flow
:
"application"
scopes
:
Object
Read
:
"Read access to protected resources"
__proto__
:
Object
tokenUrl
:
"https://security.starrwarrs.com/core/connect/token"
type
:
"oauth2"
__proto__
:
Object
__proto__
:
Object
length
:
1
__proto__
:
Array[0]