我希望创建一个新的Web应用程序,允许用户首先输入用户ID,然后根据该用户的id在网站中导航。因此,首先用户将搜索ID,选择该用户并根据该ID提供可用选项。
目前我使用Query字符串来存储ID,所以... / AddProduct / 2222。 这很好但我对安全方面不太确定。我考虑过会话和cookie,但我不认为它们适合这种情况。或者我是否加密查询字符串的ID?
有没有人有任何想法?
由于
修改
我忘了提及,用户将在网站上的每个页面上进行身份验证并拥有特定权限。数据也存储在数据库中。因此,该网站将查询和编辑/添加当前数据。
答案 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无法操作 - >用户不能冒充其他用户。因此,一旦您获得了当前用户的保证,剩下的就是执行必要的授权,无论他是否可以访问所请求的资源。