ASP.NET MVC 4对同一用户或管理员的授权

时间:2013-02-16 05:05:28

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 authorization

您好我想在我的控制器中的操作方法上放置一个授权过滤器,可以由同一个用户或管理员访问。

假设有一个用户Alex注册到我的网站,现在想要编辑他的个人资料。所以他应该被允许只编辑他的个人资料而不是其他人,或者管理员有权编辑每个人的个人资料。

我可以在Authorize属性中添加admin作为admin,但是如何处理自我用户的事情。请帮助

[Authorize(Roles="admin")]

2 个答案:

答案 0 :(得分:4)

这是一个授权过滤器的示例,它将检查用户名(可以是GUID或任何其他方法)是否与传递给路由的参数匹配,并检查Admin上的用户角色

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!httpContext.User.Identity.IsAuthenticated)
            return false;  // if user not Authenticated, do not allow

        string userName = filterContext.HttpContext.User.Identity.Name;
        string id = filterContext.RouteData.Values[this.RouteParameter];

        If (userName == id)
            return true;  // assuming paramter passed matches username, allow
        else if (filterContext.HttpContext.User.IsInRole( "Admin" ) || IsOwner( filterContext ))
            return true;  // if user has role Admin, allow


        return true;
    }
}

虽然这是未经测试的,并且意味着指导的不仅仅是解决您的需求,我认为它将接近实施。

与此同时,我想在你的方法上增加2美分:

我更赞成动作过滤器,它会进行类似的检查并将用户重定向到他们自己的页面或警告页面。虽然我重视安全授权过滤器的提供,但我发现它们相当直率。我更喜欢基于权限的安全性和软重定向,以提供更优雅的用户体验。

答案 1 :(得分:0)

这是我在更改密码中的方式,只有该用户才能更改自己的密码。

 在我的帐户控制器

    //
    // GET: /Account/ChangePassword
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }

    //
    // POST: /Account/ChangePassword
    [Authorize]
    [HttpPost]
    public ActionResult ChangePassword(ChangePasswordModel model)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
                return RedirectToAction("ChangePasswordSuccess");
            else
                ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

然后在我的 _Layout 中我声明它是这样的,只有那个用户可以看到并打开ActionLink并更改他/她自己的密码

@if (HttpContext.Current.User.Identity.IsAuthenticated)
   {
    <li>@Html.ActionLink("Change Password", "ChangePassword", "Account")</li>                     
   }

希望这也会帮助你..干杯。 :)