Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web应用中的安全方法_C#_Asp.net_Security_Web Applications_Membership Provider - Fatal编程技术网

C# web应用中的安全方法

C# web应用中的安全方法,c#,asp.net,security,web-applications,membership-provider,C#,Asp.net,Security,Web Applications,Membership Provider,我正在ASP.NET/C中设计一个web应用程序,其中每个注册用户都可以根据其用户id添加/修改/删除行 举个例子: 我将在属于我的页面/route.aspx?routeid=854上编辑我的路线(用户id:1) 但因为我是一个好奇的人,所以我尝试访问属于另一个用户(用户id:2)的/route.aspx?routeid=855 我如何才能最好地避免人们访问其他人的数据?我是否应该在每次数据库调用时发送每个用户id(来自会话),是否应该在每次页面加载时验证用户/密码,或者什么是最佳和最安全的方法

我正在ASP.NET/C中设计一个web应用程序,其中每个注册用户都可以根据其用户id添加/修改/删除行

举个例子:

我将在属于我的页面
/route.aspx?routeid=854
上编辑我的路线(用户id:1)

但因为我是一个好奇的人,所以我尝试访问属于另一个用户(用户id:2)的
/route.aspx?routeid=855

我如何才能最好地避免人们访问其他人的数据?我是否应该在每次数据库调用时发送每个用户id(来自会话),是否应该在每次页面加载时验证用户/密码,或者什么是最佳和最安全的方法


我希望我已经说得够清楚了。

您最好的方法是使用routeId将用户ID发送到数据库,以查看用户是否可以访问它

比如:

select * from route where routeId=@routeId and userId=@userId
如果您使用的是Linq之类的工具,您可以通过应用用户限制(如可重用函数)来创建更好的安全模型,如下所示:

public Route Get(int routeId, int userId)
{
    var query repository.Get<Route>().Where(r => r.Id == routeId);
    query = applySecurityModel(query, userId);
    return query.FirstOrDefault();
}

private IQueryable<T> applySecurityModel<T>(IQueryable<T> query, int userId) where T : ISecurable
{
    return query.Where(t => t.UserId == userId);
}

public interface ISecurable
{
    int UserId { get; set; }
}

public class Route
{
    int Id { get; set; }
    int UserId { get; set; }
}
public-Route-Get(int-routeId,int-userId)
{
var query repository.Get().Where(r=>r.Id==routeId);
query=applySecurityModel(查询,用户ID);
返回query.FirstOrDefault();
}
私有IQueryable applySecurityModel(IQueryable查询,int userId),其中T:ISecurable
{
返回query.Where(t=>t.UserId==UserId);
}
公共接口不可治愈
{
int UserId{get;set;}
}
公务舱路线
{
int Id{get;set;}
int UserId{get;set;}
}

不要重新发明轮子

编辑:存储用户ID-您不必这样做。只要用户登录,您就可以随时从MembershipProvider处获得它。当然:

MembershipUser user = Membership.GetUser();
Guid UserID = user.ProviderUserKey;
听起来您需要实现ASP.NET成员资格提供程序。阅读此资源:

另外,Scott Guthrie的一个优秀系列:

通常,采用这种方法:使用表单身份验证来验证用户是谁。这是安全性的身份验证方面。也就是说,确定用户是他们所说的人,通常使用用户名和密码

安全性的第二部分是授权,一旦您知道用户是谁,就会发生授权。这主要包括确定经过身份验证的用户可以访问哪些资源。一个成熟的系统将包括以下实体:

User: may contain extended profile information captured on registration
Resource: a page or other resource that can be restricted.
Group: a group of users who can access resources due to their group membership (groups are granted resource access)
Role: a type of user such as Administrator/Developer/Salesperson. 
因此,要授予用户对routeid 854(资源)的访问权限,您可以直接将资源授予该用户,或者如果有多个用户应该拥有该资源的访问权限,并且这些用户构成一个自然组,则创建该组,将资源授予该组,并将用户添加到该组中

然后,您可以通过资源id访问User.Resources,也可以使用

if(!User.IsInRole("RoleName"))
{
  //redirect to access denied page
}
使用提供者模型有很多好东西可用


编辑:如果决定存储有关用户的配置文件信息,需要注意的事项:ProfileProvider的默认实现不是特别好。Scott Guthrie写了一篇关于一个更好的基于表的提供者的好文章:

存储此用户id的最佳方法是什么?会话?我是否应该在页面加载时验证当前用户对应于此用户id?保存用户id服务器端(例如在会话对象中)而不是客户端(例如在cookie中)。好的,我将在会话中存储该id。它足够安全吗?我是否应该在每次加载页面时刷新会话以确保用户id存在?我正在使用ASP.NET成员资格提供程序进行登录。但是很高兴看到一些关于自定义信息的信息。:-)下面我们将阅读更多这方面的内容。好东西:这里也有一些很好的示例代码:关于存储用户ID,请看我答案顶部的编辑。