首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带权限代码的ASP.NET MVC 4自定义授权属性(不带角色)

带权限代码的ASP.NET MVC 4自定义授权属性(不带角色)
EN

Stack Overflow用户
提问于 2012-11-07 14:46:02
回答 4查看 155.5K关注 0票数 126

我需要根据我的MVC4应用程序中的用户特权级别(没有角色,只有分配给用户的CRUD操作级别的特权级别)来控制对视图的访问。

例如,下面的AuthorizeUser将是我的自定义属性,我需要像这样使用它:

代码语言:javascript
复制
[AuthorizeUser(AccessLevels="Read Invoice, Update Invoice")]
public ActionResult UpdateInvoice(int invoiceId)
{
   // some code...
   return View();
}


[AuthorizeUser(AccessLevels="Create Invoice")]
public ActionResult CreateNewInvoice()
{
  // some code...
  return View();
}


[AuthorizeUser(AccessLevels="Delete Invoice")]
public ActionResult DeleteInvoice(int invoiceId)
{
  // some code...
  return View();
}

可以这样做吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-08 15:37:39

我可以用一个自定义属性来做这件事,如下所示。

代码语言:javascript
复制
[AuthorizeUser(AccessLevel = "Create")]
public ActionResult CreateNewInvoice()
{
    //...
    return View();
}

自定义属性类,如下所示。

代码语言:javascript
复制
public class AuthorizeUserAttribute : AuthorizeAttribute
{
    // Custom property
    public string AccessLevel { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {                
            return false;
        }

        string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // Call another method to get rights of the user from DB

        return privilegeLevels.Contains(this.AccessLevel);           
    }
}

您可以通过覆盖HandleUnauthorizedRequest方法在自定义AuthorisationAttribute中重定向未经授权的用户:

代码语言:javascript
复制
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                        { 
                            controller = "Error", 
                            action = "Unauthorised" 
                        })
                );
}
票数 249
EN

Stack Overflow用户

发布于 2017-09-14 04:07:53

这是对prev的修改。回答。主要区别在于,当用户未通过身份验证时,它使用原始的HandleUnauthorizedRequest方法重定向到登录页面:

代码语言:javascript
复制
   protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {

        if (filterContext.HttpContext.User.Identity.IsAuthenticated) {

            filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary(
                            new
                            {
                                controller = "Account",
                                action = "Unauthorised"
                            })
                        );
        }
        else
        {
             base.HandleUnauthorizedRequest(filterContext);
        }
    }
票数 13
EN

Stack Overflow用户

发布于 2018-12-14 20:45:03

也许这对将来的任何人都有用,我已经实现了一个自定义的Authorize属性,如下所示:

代码语言:javascript
复制
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class ClaimAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _claim;

    public ClaimAuthorizeAttribute(string Claim)
    {
        _claim = Claim;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;
        if(user.Identity.IsAuthenticated && user.HasClaim(ClaimTypes.Name, _claim))
        {
            return;
        }

        context.Result = new ForbidResult();
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13264496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档