Требовать значение разрешения с контекстом

Я начинаю использовать авторизацию на основе утверждений для своего проекта веб-API asp.net.

В моих проектах пользователи могут иметь разрешение на редактирование объектов. Но у пользователя есть разрешение на редактирование entity1, но не entity2. Формально он должен уметь делать POST entities/1, но не POST entities/2.

Думаю, как добавить эту информацию в Claims. Я вижу 2 подхода:

  1. Добавить Претензию со значением, содержащим идентификатор объекта:

    this.AddClaim(new Claim("permission", "entity/1/edit"));
    this.AddClaim(new Claim("permission", "entity/42/edit"));
    
  2. Добавьте претензию с типом edit и значением является идентификатор объекта:

    this.AddClaim(new Claim("entity/edit", "1"));
    this.AddClaim(new Claim("entity/edit", "42"));
    

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


person Backs    schedule 11.12.2018    source источник
comment
так пытаетесь как-то настаивать на этих претензиях?   -  person Jazb    schedule 11.12.2018
comment
что касается формата создания новой заявки, я бы выбрал: .AddClaim(new Claim("claimType", "some important claim value"));   -  person Jazb    schedule 11.12.2018


Ответы (1)


Лучшим подходом является авторизация на основе ресурсов. ">https://docs.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-2.2

Если вы не используете ядро ​​​​asp.net, вы можете попробовать https://leastcitation.com/2014/06/24/resourceaction-based-authorization-for-owin-and-mvc-and-web-api./

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

if (!HttpContext.CheckAccess(
    "Edit",
    "Album",
    id.ToString()))
{
    return new HttpUnauthorizedResult();
}

После этого у вас будет отдельный модуль, в котором определяются правила авторизации.

app.UseResourceAuthorization(new ChinookAuthorization());

https://github.com/IdentityModel/Thinktecture.IdentityModel/blob/master/samples/OWIN/ResourceAuthorization/WebApp/ChinookAuthorization.cs

Там вы проверите, имеет ли текущий пользователь доступ к этому ресурсу, возможно, ищете ресурс по resourceId в БД и проверяете, разрешен ли доступ текущему пользователю.

person rawel    schedule 30.01.2019