ASP.Net MVC:How 将声明权限附加到角色之类的操作

ASP.Net MVC:How to attach claim permission to action like roles

阅读有关角色和身份声明的文章,但仍有许多事情没有弄清楚。非常想知道当我们将使用带声明的身份时如何实现用户访问权限。

当我们使用角色时,我们会用单个或多个角色名称来装饰动作。如果用户具有该角色,则用户可以访问该操作,否则不会像下面的代码那样。

[AuthLog(Roles = "Manager")]
public ActionResult Create()
{
    var Product = new ProductMaster();
    return View(Product);
}

我想当我们处理身份和声明时,必须有一些方法可以将角色或权限附加到每个动作,例如角色。如果存在任何此类问题,请分享如何使用良好的示例代码实现它的想法或提供文章链接。谢谢

这是定制的 Authorize,它检查数据库的权限。 例如,您有 3 个 bools 权限 Account、Clients、Configuration 并且您想根据他们限制用户而不是在 actionresult

上放置以下行

您甚至可以在一个操作上添加两个权限,例如您有一个方法可以通过帐户和客户权限访问,而不是您可以添加以下行

[PermissionBasedAuthorize("Client, Account")]   

下面这个方法是从数据库中检查布尔值。

public class PermissionBasedAuthorize : AuthorizeAttribute
{
    private List<string> screen { get; set; }

    public PermissionBasedAuthorize(string ScreenNames)
    {
        if (!string.IsNullOrEmpty(ScreenNames))
            screen = ScreenNames.Split(',').ToList();
    }

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        base.OnAuthorization(actionContext);
        var UserId = HttpContext.Current.User.Identity.GetUserId();
        ApplicationContext db = new ApplicationContext();

        var Permissions = db.Permissions.Find(UserId);

        if (screen == null || screen.Count() == 0)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        }

        bool IsAllowed = false;

        foreach (var item in screen)
            foreach (var property in Permissions.GetType().GetProperties())
            {
                if (property.Name.ToLower().Equals(item.ToLower()))
                {
                    bool Value = (bool)property.GetValue(Permissions, null);
                    if (Value)
                    {
                        IsAllowed = true;
                    }
                    break;
                }
            }

        if (!IsAllowed)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        }
    }
}