Версия утверждений MVC5 атрибута Authorize

Я пробую некоторые из новых вещей в VS2013 RC с MVC5 и новым промежуточным ПО для аутентификации OWIN.

Итак, я привык к использованию [Authorize] атрибут для ограничения действий по ролям, но я пытаюсь использовать утверждения на основе утверждений / действий и не могу найти для него эквивалентный атрибут.

Есть ли очевидный, который я скучаю или мне нужно свернуть свой собственный? Я вроде ожидал, что будет один из коробки.

Что я ищу, так это нечто вроде [Authorize("ClaimType","ClaimValue")] Я полагаю.

Заранее спасибо.

4 ответа

Решение

Я просто написал простой атрибут для обработки. Я не мог найти что-либо в фреймворке прямо из коробки без связки дополнительных настроек. Перечислено ниже.

public class ClaimsAuthorizeAttribute : AuthorizeAttribute
{
    private string claimType;
    private string claimValue;
    public ClaimsAuthorizeAttribute(string type, string value)
    {
        this.claimType = type;
        this.claimValue = value;
    }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var user = filterContext.HttpContext.User as ClaimsPrincipal;
        if (user != null && user.HasClaim(claimType, claimValue))
        {
            base.OnAuthorization(filterContext);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

Конечно, вы могли бы удалить параметры типа и значения, если бы вы как-то использовали триплет controller-action-verb для утверждений.

  1. Вы не будете проверять претензии конкретно, а скорее на пары действий / ресурсов. Вынести фактические претензии / проверки данных в менеджер авторизации. Разделение проблем.
  2. MVC и ClaimsPrincipalPermission не очень подходят друг другу. Он генерирует исключение SecurityException и не подходит для модульного тестирования.

Моя версия здесь: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

Я обнаружил, что вы все еще можете использовать атрибут Authorization с ролями и пользователями, с заявками.
Чтобы это работало, ваш ClaimsIdentity должен включать 2 конкретных типа заявок:

    ClaimTypes.Name

а также

    ClaimTypes.Role

Затем в вашем классе, производном от OAuthAuthorizationServerProvider, в используемых вами методах GrantXX при создании ClaimsIdentity добавьте эти 2 утверждения.

Пример:

    var oAuthIdentity = new ClaimsIdentity(new[]
    {
        new Claim(ClaimTypes.Name, context.ClientId),
        new Claim(ClaimTypes.Role, "Admin"),
    }, OAuthDefaults.AuthenticationType);

Тогда на любое действие вы можете использовать [Authorize(Roles ="Admin")] ограничить доступ.

В ASP.NET Core 3 политики безопасности можно настроить следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

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

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

Источник.

[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
    _customer.Delete(id);
    return RedirectToAction("CustomerList");
}

ClaimsPrincipalPermissionAttribute Class

Другие вопросы по тегам