지금은 “멤버”가 내 컨트롤러 작업에 액세스 할 수 있도록 이와 같은 방법을 장식합니다.
[Authorize(Roles="members")]
둘 이상의 역할을 어떻게 허용합니까? 예를 들어 다음은 작동하지 않지만 수행하려는 작업 ( “멤버”및 “관리자”액세스 허용)을 보여줍니다.
[Authorize(Roles="members", "admin")]
답변
다른 옵션은 게시 할 때 단일 권한 부여 필터를 사용하지만 내부 견적을 제거하는 것입니다.
[Authorize(Roles="members,admin")]
답변
사용자 정의 역할을 사용하려면 다음을 수행하십시오.
CustomRoles
수업:
public static class CustomRoles
{
public const string Administrator = "Administrador";
public const string User = "Usuario";
}
용법
[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]
역할이 거의 없다면 다음과 같이 명확하게 표현할 수 있습니다.
public static class CustomRoles
{
public const string Administrator = "Administrador";
public const string User = "Usuario";
public const string AdministratorOrUser = Administrator + "," + User;
}
용법
[Authorize(Roles = CustomRoles.AdministratorOrUser)]
답변
하나의 가능한 단순화는 서브 클래스 일 것입니다 AuthorizeAttribute
:
public class RolesAttribute : AuthorizeAttribute
{
public RolesAttribute(params string[] roles)
{
Roles = String.Join(",", roles);
}
}
용법:
[Roles("members", "admin")]
의미 상 그것은 Jim Schmehil의 대답과 동일합니다.
답변
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;
}
}
}
이것은 Fabricio Martínez Tamayo https://github.com/fabriciomrtnz/FNHMVC/에 의해 수정 된 FNHMVC의 일부입니다.
답변
또 다른 명확한 해결책은 상수를 사용하여 규칙을 유지하고 여러 [Authorize] 특성을 추가 할 수 있습니다. 이것 좀 봐:
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
답변
이 두 가지 역할을 자주 적용하면 자신의 권한으로 래핑 할 수 있습니다. 이것은 실제로 허용되는 답변의 확장입니다.
using System.Web.Mvc;
public class AuthorizeAdminOrMember : AuthorizeAttribute
{
public AuthorizeAdminOrMember()
{
Roles = "members, admin";
}
}
그런 다음 새 권한을 조치에 적용하십시오. 나는 이것이 더 깨끗해 보이고 쉽게 읽힌다 고 생각합니다.
public class MyController : Controller
{
[AuthorizeAdminOrMember]
public ActionResult MyAction()
{
return null;
}
}
답변
서브 클래스 추가로 더 나은 코드 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 }
}
);
}
}
}
이것을 사용하는 방법
[AuthorizeRole(Rolenames.Admin,Rolenames.Member)]
public ActionResult Index()
{
return View();
}