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