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")]
для ограничения доступа.
Ответ 4
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
_customer.Delete(id);
return RedirectToAction("CustomerList");
}
Класс претензийPrincipalPermissionAttribute