現在、「メンバー」がコントローラーアクションにアクセスできるように、このようなメソッドを装飾しています
[Authorize(Roles="members")]
複数のロールを許可するにはどうすればよいですか? たとえば、次は機能しませんが、私がやろうとしていることを示しています (「メンバー」と「管理者」アクセスを許可します):
[Authorize(Roles="members", "admin")]
現在、「メンバー」がコントローラーアクションにアクセスできるように、このようなメソッドを装飾しています
[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)]
AspNetCore 2.x を使用する場合は、少し異なる方法を使用する必要があります。
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class AuthorizeRoleAttribute : AuthorizeAttribute
{
public AuthorizeRoleAttribute(params YourEnum[] roles)
{
Policy = string.Join(",", roles.Select(r => r.GetDescription()));
}
}
次のように使用してください:
[Authorize(YourEnum.Role1, YourEnum.Role2)]
別の明確な解決策として、定数を使用して規則を維持し、複数の [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
サブクラスを追加してコードを改善する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();
}