Вы настроили Swagger UI для получения токена доступа с ресурсом:
c.OAuthAdditionalQueryStringParams(new Dictionary<string, string>
{
{ "resource", "{app_ID_URI}"} //api
});
Но вы настроили свою действительную аудиторию как:
options.Audience = "{client_id}";
Swagger UI, используя идентификатор приложенияС URI все в порядке, и вместо этого вы можете настроить свой API на прием идентификатора клиента и URI в качестве аудитории (Azure AD позволяет использовать и то и другое, так почему бы не настроить свой API как таковой?):
options.TokenValidationParameters = new TokenValidationParameters
{
ValidAudiences = new List<string>{ "client-id", "app-id-uri"}
};
выше должно идти в вашем обратном вызове конфигурации AddJwtBearer
, и вы можете удалить строку options.Audience =
.
Чтобы указать области, необходимые для действия, вам нужно добавить фильтр операций внутри services.AddSwaggerGen(options =>{})
:
options.OperationFilter<AuthenticationOperationFilter>();
И определите фильтр, для которого требуется область действия OAuth для каждого действия:
public class AuthenticationOperationFilter : IOperationFilter
{
public void Apply(Operation operation, OperationFilterContext context)
{
operation.Security = new List<IDictionary<string, IEnumerable<string>>>
{
new Dictionary<string, IEnumerable<string>>
{
//Note "OAuth2" casing here must match the definition you use in Swagger UI config
["OAuth2"] = new List<string>{ "user_impersonation" }
}
};
}
}
То, что вы определили в конфигурации пользовательского интерфейса Swagger, определяет области, которые пользователь может выбрать при использовании пользовательского интерфейса.Помните, что поскольку вы используете конечные точки Azure AD v1, выбранные вами области не будут иметь значения.Маркер всегда будет содержать согласованные области действия, ни больше, ни меньше.