嗨,我想在我的控制器中的操作方法上放置一个授权过滤器,同一用户或管理员可以访问该操作方法。
假设有一个用户 Alex 注册到我的网站,现在想要编辑他的个人资料。所以应该只允许他编辑他的个人资料而不是其他人,否则管理员将有权编辑每个人的个人资料。
我可以在 Authorize 属性中添加角色为管理员,但如何解决自我用户的问题。好心的帮助
[Authorize(Roles="admin")]
嗨,我想在我的控制器中的操作方法上放置一个授权过滤器,同一用户或管理员可以访问该操作方法。
假设有一个用户 Alex 注册到我的网站,现在想要编辑他的个人资料。所以应该只允许他编辑他的个人资料而不是其他人,否则管理员将有权编辑每个人的个人资料。
我可以在 Authorize 属性中添加角色为管理员,但如何解决自我用户的问题。好心的帮助
[Authorize(Roles="admin")]
这是一个授权过滤器示例,它将检查用户名(可以是 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 美分:
我更赞成一个动作过滤器,它会做类似的检查并将用户重定向到他们自己的页面或警告页面。虽然我重视授权过滤器提供的安全性,但我发现它们相当生硬。我更喜欢提供更优雅的用户体验的基于权限的安全性和软重定向。
这就是我在更改密码中的做法,以便只有该用户可以更改他/她自己的密码。
在我的帐户控制器中
//
// 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>
}
希望这也能帮助你..干杯。:)