2017-04-18 126 views
0

我在制作一个小型的SAAS应用程序。我为所有用户使用相同的数据库,只使用用户名和ID区分数据。这意味着用户可以在浏览器中输入新的URL并查看其他用户的数据。这当然不是一个理想的方法。我想做一个检查,看看当前用户是否可以实际访问资源:例如。我如何在我的ASP.NET MVC应用程序中进行自定义授权

http://myapplication.com/images/15 

而且如果用户更改URL来

http://myapplication.com/images/16 

我应该做我的数据库检查,以查看当前用户实际访问看到的用户ID 16.如果图像不会重定向到“未经授权”页面。

我该如何实施?

+0

看看这篇文章:https://weblogs.asp.net/jongalloway/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way – TrevorBrooks

回答

0

的第一步是确保你永远不会有任何ID的用户本身网址。例如,从来没有http://example.com/?user=10。您应始终从身份验证中获取用户标识,而不是从网址(或发布的值)中获取用户标识。

第二步,在您的查询中使用该ID。所以,举个例子,假设他们寻求http://example.com/images/100,那么在你的数据库中,你应该有一个将资产的所有权与用户相关联的机制,或者是用户标识符或者ID到资产的映射表等等。这样,如果用户不允许访问,它只会返回一个空的结果集。数据不可能被返回,空的结果集应该告诉页面该项不存在(不一定是授权失败,只是该对象不存在)。第三,任何内在关于用户的页面(例如用户简档,帐户页面或仪表板)都不应该在URL中具有任何ID,它应该自动进入经过验证的用户页面。最后,如果您需要阻止用户访问整个页面或一组页面,那么您应该在OnAuthorization事件或类似的(自定义属性,基类等等)中执行此操作,在属性授权和使用基于角色的授权。永远不要在PageLoad或类似事件中进行授权(例如控制器操作),因为到达该步骤时,管道中已经发生了大量工作。在页面甚至开始安装之前,最好阻止访问。授权事件发生在管道的最初阶段。

+0

干杯,与用户建立联接表格,并以易于实施的方式解决了问题。我将研究进一步开发的自定义属性,但目前这工作正常。 –

0

作出这样的检查帐户及返回错误页面或文件

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"} 
); 
} 
相关问题