在页面之间安全地传递数据

时间:2014-03-03 16:43:19

标签: asp.net-mvc security

我希望创建一个新的Web应用程序,允许用户首先输入用户ID,然后根据该用户的id在网站中导航。因此,首先用户将搜索ID,选择该用户并根据该ID提供可用选项。

目前我使用Query字符串来存储ID,所以... / AddProduct / 2222。 这很好但我对安全方面不太确定。我考虑过会话和cookie,但我不认为它们适合这种情况。或者我是否加密查询字符串的ID?

有没有人有任何想法?

由于

修改

我忘了提及,用户将在网站上的每个页面上进行身份验证并拥有特定权限。数据也存储在数据库中。因此,该网站将查询和编辑/添加当前数据。

1 个答案:

答案 0 :(得分:1)

所以基本上你似乎害怕某些用户可能会修改属于另一个用户的项目。好吧,这句话告诉我们你的应用程序中有用户和项目,并且有一些与这些项目相关的角色。并且您有一种识别这些用户的机制。因此,您可能正在使用某种身份验证,例如内置的FormsAuthentication。所以现在问题变成:如何确保当前经过身份验证的用户不修改属于另一个用户的产品。

好的,所以你有属于用户的项目。我想这些信息存储在服务器上的某个地方,可能是数据库或其他东西。我建议你采用的一种方法是编写一个自定义授权属性,该属性将检查所请求的资源id是否实际属于当前经过身份验证的用户。

例如:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {
            // The user is not authenticated or authorized => no need to continue further
            return false;
        }

        // At this stage we know that the user is authorized => we can fetch
        // the username
        string username = httpContext.User.Identity.Name;

        // Now let's fetch the id of the resource he is trying to manipulate from the request
        string id = httpContext.Request["id"];

        // All that's left is to verify if the current user is the owner 
        // of the account
        return IsOwnerOfItem(username, id);
    }

    private bool IsOwnerOfItem(string username, string id)
    {
        // TODO: query the backend to perform the necessary verifications
        // about whether the user has permissions to work with the resource
        // pointed by the id parameter

        throw new NotImplementedException();
    }
}

现在剩下的就是用这个自定义属性装饰你的AddProduct控制器动作:

[MyAuthorize]
public ActionResult AddProduct(int id)
{
     // if we get that far we know that the currently authenticated user
     // is the owner of the resource pointed by the id parameter and we
     // could proceed respectively
     ...
}

使用此方法,您无需使用任何会话或加密任何内容。加密已经以Forms身份验证cookie的形式内置到ASP.NET框架中,该cookie以安全的方式保存当前经过身份验证的用户名。此cookie无法操作 - >用户不能冒充其他用户。因此,一旦您获得了当前用户的保证,剩下的就是执行必要的授权,无论他是否可以访问所请求的资源。