【问题标题】:How can i do custom authorization in my ASP.NET MVC application如何在我的 ASP.NET MVC 应用程序中进行自定义授权
【发布时间】:2023-03-03 08:56:23
【问题描述】:

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

http://myapplication.com/images/15

如果用户将 url 更改为

http://myapplication.com/images/16

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

我该如何实现?

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 干杯,创建了与用户表的连接,并以易于实施的方式解决了问题。我将研究自定义属性以进行进一步开发,但目前它工作正常。
【解决方案2】:

创建一个检查 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");
}

路由配置文件

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

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 2010-11-01
    • 2013-12-14
    • 2013-10-31
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多