В этом случае вы можете настроить клиентский доступ с помощью областей. Области не должны использоваться для авторизации, но в этом случае вы хотите (и можете) настроить клиентский доступ к ресурсу.
Обратите внимание, что это не прямая авторизация. Область действия определяет часть функциональности в ресурсе. Когда клиент не может запросить область действия, он ограничивается функциональностью, являющейся частью настраиваемой области (областей).
Но это работает только для этого конкретного случая, поскольку это клиент только и нет вовлеченных (интерактивных) пользователей.
Предположим, у вас есть один ресурс: myresource
.
И этот ресурс имеет две области действия, например myresource.read
и myresource.write
.
Теперь вы можете настроить Client.AllowedScopes , где client1 имеет область действия myresource.read
, а client2 имеет области действия myresource.read
и myresource.write
.
Убедитесь, что вы реализовали две области в ресурсе. Вы можете определить политики, которые ищут определенную область:
services.AddAuthorization(option =>
{
option.AddPolicy("ReadAccess", p => p.RequireScope("myresource.read"));
option.AddPolicy("WriteAccess", p => p.RequireScope("myresource.write"));
});
и запретить доступ клиентам, у которых нет какой-либо области действия:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.JwtBearerEvents = new JwtBearerEvents
{
OnTokenValidated = async context =>
{
var allowedScopes = new List<string> { "myresource.read" , "myresource.write" };
if (!context.Principal.Claims.Any(c => c.Type == "scope" && allowedScopes.Contains(c.Value)))
{
context.Fail("Invalid Scope");
}
}
};
});
В ваших контроллерах вы можете ограничить доступ на основе политик, используя атрибут Authorize, например
[Authorize("myresource.read")]
public class MyController : ControllerBase