24

我正在创建一个具有用户概念的 asp.net mvc 应用程序。每个用户都可以编辑自己的个人资料。例如:

那里没有什么特别令人兴奋的...

但是,我在授权方案上遇到了一些麻烦。目前系统中只有两个角色,“管理员”和“默认用户”,但未来可能会更多。

我不能使用常规的 Authorize 属性来指定授权,因为两个用户都处于相同的角色(即“DefaultUser”)。

所以,如果我像这样指定授权过滤器:

[Authorize(Roles = "DefaultUser")]

那么就没有效果了。PersonID=1 可以进入并编辑他们自己的个人资料(他们应该可以这样做),但他们也可以将 URL 更改为http://localhost/person/edit/2并且他们拥有编辑 PersonID=2 的完全权限profile 以及(他们不应该这样做)。

这是否意味着我必须创建自己的授权过滤器,在允许他们访问之前检查用户请求的操作是否“属于”他们?也就是说,如果当前登录的人正在请求参数= 1的编辑操作,我是否需要进行自定义检查以确保当前登录的人是PersonID = 1,如果是,授权他们,如果没有,拒绝访问?

感觉好像我在这里遗漏了一些明显的东西,所以任何指导都将不胜感激。

4

5 回答 5

62

也许您可以组织控制器操作,使 URL 更像http://localhost/person/editme并显示当前登录用户的编辑表单。这样,用户就无法破解 URL 来编辑其他人。

于 2008-12-24T07:03:51.867 回答
36

我的 $.02:

授权和认证是两个不同的东西。简单地说,问题是你能做这件事吗?你应该做吗?你可以挑你的朋友,你可以挑你的鼻子,但你不能挑你朋友的鼻子!如果每个角色都可以做到(用户有手和鼻子),则无需检查授权。有一个 Post 方法供用户访问他们自己的个人资料并使用表单的隐藏值或重定向测试个人资料 ID(不是你的鼻子,走开)。

有一个 Get 方法来编辑其他个人资料,只需在此处检查管理员角色 - (我是一名医生,我有权将事情放在你的鼻子上)......

于 2009-06-28T12:11:34.793 回答
16

一个更优雅的解决方案是编写自己的授权操作过滤器,或者通过扩展 [Authorize],或者实现 IAuthorizationFilter,如下所示:

public class AuthorizeOwnerAttribute: FilterAttribute, IAuthorizationFilter
{
    #region IAuthorizationFilter Members

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        // add logic here that compares the currently logged in user, to the owner of the profile that is being edited
        // get currently logged in user info from filterContext.HttpContext.User.Identity;
        // get profile being edited from filterContext.RouteData or filterContext.Something
    }

    #endregion
}

我不确定 OnAuthorization 方法的实际逻辑是什么,但我的评论应该为您提供一个起点。您必须通过 Google 了解更多信息 - 如何将用户重定向到不同的视图,或者是否抛出在其他地方处理的强类型异常(可能在 [HandleError] 属性中)。

于 2009-06-25T13:41:32.027 回答
10

马特是对的。

授权的目的是表明他们被允许执行该功能 - 您尝试做的是说明他们是否可以执行该特定 ID 的功能。

所以有两个解决方案:

  1. 就像马特说的那样,做一个不带 ID 的动作,但从会话信息中查找当前登录的用户,并检索它们。
  2. 执行一个需要 ID 的操作,但只允许管理员访问 - 这样他们就可以在需要时修改其他用户信息。

但要回答这个问题,授权只是说“是的,这个人可以使用修改用户操作”,而不是基于输入的参数。

另一种方法是,您可以让它检查用户是否检索了 == 当前用户,或者重定向到另一个动作,说他们不能编辑该用户 - 但最好只提供一个不采取id,并且只获取当前登录的用户。

于 2008-12-24T07:25:29.797 回答
4

此问题的解决方案:http: //nerddinnerbook.s3.amazonaws.com/Part9.htm

“在编辑晚餐时使用 User.Identity.Name 属性

现在让我们添加一些限制用户的授权逻辑,以便他们只能编辑他们自己主持的晚餐的属性……”

于 2010-02-22T13:20:25.927 回答