Версия утверждений 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 для утверждений.
- Вы не будете проверять претензии конкретно, а скорее на пары действий / ресурсов. Вынести фактические претензии / проверки данных в менеджер авторизации. Разделение проблем.
- 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");
}