我正在制作一个小型SAAS应用程序。我为所有用户使用相同的数据库,只使用用户名和ID区分数据。这意味着用户可以在浏览器中键入新URL并查看其他用户数据。当然,这不是一种理想的方法。我想检查当前用户是否可以实际访问资源:例如。
http://myapplication.com/images/15
如果用户将网址更改为
http://myapplication.com/images/16
我应该检查一下我的数据库,看看当前用户是否真的有权查看用户ID为16的图片。如果没有重定向到“未授权”页面。
我该如何实现?
答案 0 :(得分:0)
制作检查userId并返回错误页面或文件的操作
public FileResult Image(string imageName)
{
string UserId = MethodWhereYouGetCurrentUserID();
if(imageName == null) return View("~/Views/Shared/Error.cshtml", (object)"Null image");
string imageShortName = imageName.Split(".")[0];
if(!UserId == imageShortName) return View(~/Views/Shared/Error.cshtml, (object)"You can't access to this");
string path = Server.MapPath("~/Contant/images/"+imageName);
return File(path, "image/jpg");
}
RouteConfig文件
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute
(
name: "ImageRoute",
url: "/images/imageName",
default: new {controller = "Home", action = "GetImage"}
);
}
答案 1 :(得分:0)
第一步是确保您在网址中永远不会为用户提供任何ID。例如,永远不会有<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.0.Final</version>
</dependency>
。您应始终从其身份验证中获取用户ID,而不是从URL(或已发布的值)中获取用户ID。
第二步,在查询中使用该ID。因此,例如,让我们说他们寻求http://example.com/?user=10
,然后在您的数据库中,您应该有一个机制将资产的所有权链接到用户,用户ID或id&的映射表#39; s到资产等。这样,如果用户不被允许访问,它将只返回一个空的结果集。返回数据是不可能的,空结果集应该告诉您的页面该项目不存在(不一定是授权失败,只是对象不存在)。
第三,任何与用户有关的网页(例如用户个人资料,帐户页面或信息中心)都不应该在网址中包含任何ID,它应该只是自动转到经过身份验证的用户页面
最后,如果您需要阻止用户访问整个页面或一组页面,那么您应该在OnAuthorization事件或类似事件(自定义属性,基类等)或使用内置函数中执行此操作属性授权和使用基于角色的授权。永远不要在PageLoad或类似事件(例如控制器操作)中进行授权,因为当您进入该步骤时,管道中已经发生了很多工作。在页面开始设置之前很久就阻止访问。授权事件发生在管道的最开始。