Ответ 1
Другим вариантом является использование одного фильтра авторизации по мере публикации, но удаление внутренних котировок.
[Authorize(Roles="members, admin")]
Сейчас я украшаю метод, подобный этому, чтобы позволить "членам" получать доступ к действию моего контроллера.
[Authorize(Roles="members")]
Как разрешить несколько роли? Например, следующее не работает, но показывает, что я пытаюсь сделать (разрешить доступ "члены" и "админ" ):
[Authorize(Roles="members", "admin")]
Другим вариантом является использование одного фильтра авторизации по мере публикации, но удаление внутренних котировок.
[Authorize(Roles="members, admin")]
Если вы хотите использовать пользовательские роли, вы можете сделать это:
[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]
CustomRoles
класс:
public static class CustomRoles
{
public const string Administrator = "Administrador";
public const string User= "Usuario";
}
Одним из возможных упрощений будет подкласс AuthorizeAttribute
:
public class RolesAttribute : AuthorizeAttribute
{
public RolesAttribute(params string[] roles)
{
Roles = String.Join(",", roles);
}
}
Использование:
[Roles("members", "admin")]
Семантически это совпадает с ответом Джима Шмехиля.
Для MVC4, используя Enum
(UserRoles
) с моими ролями, я использую пользовательский AuthorizeAttribute
.
В моем контролируемом действии я делаю:
[CustomAuthorize(UserRoles.Admin, UserRoles.User)]
public ActionResult ChangePassword()
{
return View();
}
И я использую пользовательский AuthorizeAttribute
:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorize : AuthorizeAttribute
{
private string[] UserProfilesRequired { get; set; }
public CustomAuthorize(params object[] userProfilesRequired)
{
if (userProfilesRequired.Any(p => p.GetType().BaseType != typeof(Enum)))
throw new ArgumentException("userProfilesRequired");
this.UserProfilesRequired = userProfilesRequired.Select(p => Enum.GetName(p.GetType(), p)).ToArray();
}
public override void OnAuthorization(AuthorizationContext context)
{
bool authorized = false;
foreach (var role in this.UserProfilesRequired)
if (HttpContext.Current.User.IsInRole(role))
{
authorized = true;
break;
}
if (!authorized)
{
var url = new UrlHelper(context.RequestContext);
var logonUrl = url.Action("Http", "Error", new { Id = 401, Area = "" });
context.Result = new RedirectResult(logonUrl);
return;
}
}
}
Это часть модифицированного FNHMVC от Fabricio Martínez Tamayo https://github.com/fabriciomrtnz/FNHMVC/
Еще одно четкое решение, вы можете использовать константы для сохранения соглашения и добавления нескольких атрибутов [Авторизовать]. Проверьте это:
public static class RolesConvention
{
public const string Administrator = "Administrator";
public const string Guest = "Guest";
}
Затем в контроллере:
[Authorize(Roles = RolesConvention.Administrator )]
[Authorize(Roles = RolesConvention.Guest)]
[Produces("application/json")]
[Route("api/[controller]")]
public class MyController : Controller
//Better Code With Adding a Subclass AuthorizeRole.cs
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
class AuthorizeRoleAttribute : AuthorizeAttribute
{
public AuthorizeRoleAttribute(params Rolenames[] roles)
{
this.Roles = string.Join(",", roles.Select(r => Enum.GetName(r.GetType(), r)));
}
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "action", "Unauthorized" },
{ "controller", "Home" },
{ "area", "" }
}
);
//base.HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "action", "Login" },
{ "controller", "Account" },
{ "area", "" },
{ "returnUrl", HttpContext.Current.Request.Url }
}
);
}
}
}
//How to Use this
[AuthorizeRole(Rolenames.Admin,Rolenames.Member)]
public ActionResult Index()
{
return View();
}