Управление клиентским доступом - PullRequest
0 голосов
/ 08 января 2020

У меня есть два разных клиентских приложения, которые подключаются к одному клиенту API. Я хочу, чтобы у одного был доступ только для чтения (только для вызовов), а у другого - возможность записи (получение, установка, публикация и удаление вызовов). Как я должен выполнить это?

Окончательное решение:

Это в конечном итоге то, что я сделал. Важно отметить, что для этого решения требуется дополнительная библиотека.

https://www.nuget.org/packages/IdentityServer4.AccessTokenValidation/ или https://github.com/IdentityServer/IdentityServer4.AccessTokenValidation

services.AddMvcCore(options =>  
{  
// require at least one of the scopes listed var policy =  
 ScopePolicy.Create("client_api_readonly", "client_api_fullaccess");  
options.Filters.Add(new AuthorizeFilter(policy));  
});  

services.AddAuthorization(option =>  
{  
// where the attribute is set, require the following scope  
option.AddPolicy("ApiFullAccess", p =>  
p.RequireScope("client_api_fullaccess"));  
});  

Ответы [ 2 ]

1 голос
/ 09 января 2020

В этом случае вы можете настроить клиентский доступ с помощью областей. Области не должны использоваться для авторизации, но в этом случае вы хотите (и можете) настроить клиентский доступ к ресурсу.

Обратите внимание, что это не прямая авторизация. Область действия определяет часть функциональности в ресурсе. Когда клиент не может запросить область действия, он ограничивается функциональностью, являющейся частью настраиваемой области (областей).

Но это работает только для этого конкретного случая, поскольку это клиент только и нет вовлеченных (интерактивных) пользователей.


Предположим, у вас есть один ресурс: 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
0 голосов
/ 08 января 2020

Предполагая, что вы написали API и что ваше подключение к нему каким-то образом аутентифицировано, вы должны иметь возможность в API искать аутентифицированного пользователя и проверять его привилегии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...