MVC5 утверждает версию атрибута Authorize

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

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

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

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

Спасибо заранее.

Ответ 1

В итоге я просто написал простой атрибут для его обработки. Я не мог найти ничего в каркасе прямо из коробки без кучи дополнительной конфигурации. Ниже приведен список.

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);
        }
    }
}

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

Ответ 2

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

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

Ответ 3

Я обнаружил, что вы все равно можете использовать атрибут авторизации с ролями и пользователями с претензиями.
Чтобы это сработало, ваше 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")] для ограничения доступа.