Авторизация на основе утверждений и где добавить, что может делать пользователь - PullRequest
1 голос
/ 13 апреля 2020

Я только что реализовал веб-API, используя авторизацию на основе утверждений. Пользователь может войти в систему, и набор требований извлекается из базы данных и добавляется в httpContext.User.Identity в зависимости от того, что пользователь может сделать.

После регистрации политик в Startup.cs что-то вроде:

services.AddAuthorization(options =>
{
    options.AddPolicy(PoliciesDefinitions.RequiresVehicleList, policy => policy.RequireClaim(Permissions.VehiclesList.ToString()));

    ...               
});

Я могу использовать атрибут Authorize в методе контроллеров, который я хочу авторизовать с чем-то вроде:

Authorize(Policy=PoliciesDefinitions.RequiresDriversList)]
[HttpGet]
public ActionResult Get() { ... }

Это работает нормально, но сегодня я немного более подробно читал документацию Microsoft и натолкнулся на это утверждение в документации по авторизации на основе утверждений:

Заявка - это пара имя-значение, которая представляет то, что субъект, а не то, что субъект может сделать

В настоящее время я делаю именно то, что предлагает микрофлот, не делать. Я добавляю то, что пользователь может сделать (разрешения) к личности. Итак, это заставляет меня задуматься, я делаю это неправильно? Если ответ «да», где вы будете хранить разрешения пользователей и как будет работать авторизация?

1 Ответ

0 голосов
/ 14 апреля 2020

Это позволяет использовать KVP и несколько значений.

// with Razor, you did not specific if it was core 2, 3.1 or Razor

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Vendors", policy =>
                          policy.RequireClaim("Type.Tykt.org", "Dealer", "Driver", "WholeSaler", "Asset", "Repair"));
    });
}

Опция 2:

Также существует коллекция claims, которую можно добавить после успешного выполнения пользователем. входит в систему.

var user = new User {
  Email = "xyz@tykt.org",
  Name =  "xyz"
}

user.Claims.Add(new IdentityUserClaim<string> 
{ 
    ClaimType="your-type",   // your key
    ClaimValue="your-value"  // your value
});

await userManager.CreateAsync(user);

Обновление Ссылка MSDN :

Это действительно ваш выбор того, как вы сохраняете извлечение, если я понимаю вопрос, ваш В частности, вопрос заключается в значении претензии.

Как правило, сопоставление и проверка происходит в чем-то вроде PermissionHandler : IAuthorizationHandler или обобщенного c подхода MinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>. Который загружает значения и обрабатывает проверку требований для определенного разрешения c, например, для минимального возраста, но для фактических утверждений (что вы заявляете / min age policy против значение обычно находится в БД как DOB = 1/1/1990) путешествовать с объектом Principal. Теперь, когда вы решите получить значение претензии, вам решать

В приведенной ниже функции он получает значение для ключа из контекста и затем проверяет

public class MinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   MinimumAgeRequirement requirement)
    {
        if (!context.User.HasClaim(c => c.Type == ClaimTypes.DateOfBirth &&
                                        c.Issuer == "http://contoso.com"))
        {
            return Task.CompletedTask;
        }

        var dateOfBirth = Convert.ToDateTime(
            // He gets the value on the server-side from any store or 3rd party relayer
            context.User.FindFirst(c => c.Type == ClaimTypes.DateOfBirth && 
                                        c.Issuer == "http://contoso.com").Value);

        int calculatedAge = DateTime.Today.Year - dateOfBirth.Year;
        if (dateOfBirth > DateTime.Today.AddYears(-calculatedAge))
        {
            calculatedAge--;
        }

        if (calculatedAge >= requirement.MinimumAge)
        {
            context.Succeed(requirement);
        }

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