回答:
別のオプションは、投稿時に単一の承認フィルターを使用するが、内部の引用を削除することです。
[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)]
可能な単純化の1つは、サブクラス化すること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;
}
}
}
これは、FabricioMartínezTamayoによって変更されたFNHMVCの一部ですhttps://github.com/fabriciomrtnz/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
Authorize
属性はANDセマンティクスを使用し、すべての条件を満たす必要があります(つまり、ユーザーは管理者ロールとゲストロールの両方に属している必要があります)。
これらの2つのロールを頻繁に適用している場合は、それらを独自の承認でラップできます。これは本当に受け入れられた答えの延長です。
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();
}
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)]
Intent promptInstall = new Intent(android.content.Intent.ACTION_VIEW);
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
promptInstall.setDataAndType(Uri.parse("http://10.0.2.2:8081/MyAPPStore/apk/Teflouki.apk"), "application/vnd.android.package-archive" );
startActivity(promptInstall);