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

How can i do custom authorization in my ASP.NET MVC application

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

http://myapplication.com/images/15

并且如果用户将 url 更改为

http://myapplication.com/images/16

我应该检查我的数据库,看看当前用户是否真的有权查看用户 ID 为 16 的图像。如果没有,则重定向到 "not authorized" 页面。

我该如何实施?

执行检查用户 ID 和 returns 错误页面或文件的操作

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");
}

路由配置文件

public static void RegisterRoutes(RouteCollection routes)
{
  routes.MapRoute
  (
    name: "ImageRoute",
    url: "/images/imageName",
    default: new {controller = "Home", action = "GetImage"}
  );
}

第一步是确保您永远不会在 url 中拥有用户本身的任何 ID。例如,永远不要 http://example.com/?user=10。您应该始终从他们的身份验证而不是从 URL(或发布的值)中获取用户 ID。

第二步是在您的查询中使用该 ID。因此,例如,假设他们寻求 http://example.com/images/100,那么在您的数据库中,您应该有一种机制将资产的所有权链接到用户,用户 ID 或 id 到资产的映射 table,等等.. 这样,如果不允许用户访问,它只会 return 一个空结果集。数据不可能被 returned,空的结果集应该告诉你的页面该项目不存在(不一定是授权失败,只是对象不存在)。

第三,任何本质上与用户有关的页面,例如用户个人资料、帐户页面或仪表板,在 URL 中根本不应该有任何 ID,它应该自动转到经过身份验证的用户页面。

最后,如果您需要阻止用户访问整个页面或一组页面,那么您应该在 OnAuthorization 事件或类似事件(自定义属性、基础 class 等)中执行此操作。或使用内置属性授权并使用基于角色的授权。切勿在 PageLoad 或类似事件(例如控制器操作)中进行授权,因为当您到达该步骤时,管道中已经发生了很多工作。最好在页面开始设置之前很久就阻止访问。授权事件发生在管道的最开始。