如何在ASP.NET MVC应用程序中进行自定义授权

时间:2017-04-18 14:52:25

标签: asp.net asp.net-mvc asp.net-authorization

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

http://myapplication.com/images/15

如果用户将网址更改为

http://myapplication.com/images/16

我应该检查一下我的数据库,看看当前用户是否真的有权查看用户ID为16的图片。如果没有重定向到“未授权”页面。

我该如何实现?

2 个答案:

答案 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或类似事件(例如控制器操作)中进行授权,因为当您进入该步骤时,管道中已经发生了很多工作。在页面开始设置之前很久就阻止访问。授权事件发生在管道的最开始。