gpt4 book ai didi

asp.net-mvc - ASP.Net MVC : Check if URL is Authorized

转载 作者:行者123 更新时间:2023-12-04 14:52:14 24 4
gpt4 key购买 nike

我想简单地从 Controller 检查另一个 URL 是否被授权。

例如,我想像这样调用 Controller :

[HttpPost]
public ActionResult IsUrlAuthorized(string url)
{
bool isAuthorized = // What do I put here?
return Json(isAuthorized);
}

所以我想知道我可以调用什么来检查当前用户是否有权访问传入的 URL。我猜答案与路由有关,它位于 MVC 之外?

这是一个有点相似但又不完全相同的问题: ASP.NET MVC. Check if user is authorized from JavaScript

由于用户可能获得也可能未获得一般授权,但可能没有查看特定 URL 的正确权限或角色分配。

想法?

更新:我使用标准的 MVC 授权属性来锁定我的应用程序,所以我将在这里给出一个示例。在 MVC 中,路由映射到 Controller 。 Controller 上的单个方法可以限制为一个或多个角色:

public class HomeController : Controller
{
[Authorize(Roles = "User, Moderator")]
public ActionResult ListRecentPosts()
{
. . .
}
}

或者,可以将整个 Controller 限制为一个或多个角色:

[Authorize(Roles = "Admin")]
public class AdminController : Controller
. . .

任何这些 Controller 方法响应的实际 URL 都基于标准 MVC 应用程序中的默认映射:

routes.MapRoute("Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

但是,您可以对您的用户友好,并通过添加更多路由来使 URL 易于猜测 - 因此,一个 Controller 方法可以有许多指向它的名称。您不能仅从 URL 中假定并推断出 Controller 名称(即使它以这种方式映射了网站中一半的 URL)。

所以大概我需要一种方法直接询问路由引擎一个 URL 是否被当前用户授权,或者询问路由引擎哪个 Controller 和方法的两步,然后询问它们是否被授权 - 希望而不是通过直接使用反射和匹配角色,因为这又似乎承担了太多。

更新 2:出现这种情况的方式是我在我的应用程序顶部有一个帐户条。它的状态可以通过选择您被授权的多个帐户之一来更改。根据您在应用程序中的位置,您选择的帐户可能有权查看此页面 - 您可能正在填写您不想丢失的表格。因此,天真的方法 - 当他们选择另一个帐户时才刷新 - 是有害的,并且即使没有表格也浪费用户的时间,他们只是阅读一个全是文本的页面。

虽然这对用户来说很方便,但用户会公平地假设他们无法看到的页面,因为他们不应该拥有权限的用户确实被拒绝了(而且,将它们留在被禁止的页面 - 从中​​采取的操作将失败)。所以我需要知道是否根据他们的新权限重定向。

我喜欢 .Net 的其中一个原因是它的许多最好的库分解得很好,因此您可以轻松地重组属于其正常功能或新功能的一部分的东西。路由模块和 MVC 似乎都构建得很好,所以我不得不怀疑这是可以做到的。

廉价的 hack 是确保我的授权模块在用户未被授权时返回一致的重定向状态代码,并且当用户在帐户条中更改他们的帐户时,触发 2 个 AJAX 调用:一个更改帐户,和然后通过 AJAX 转到当前页面,只是为了检查 HTTP 状态代码。 200 OK 表示保留页面原样,Redirect 表示遵循重定向。显然这有点丑陋,涉及额外的 HTTP 调用,在日志中创建错误命中,并假设如何在应用程序中处理授权。

可能还有一个次要问题 - 页面可能已获得授权,但只是更改了它的工作方式或外观。这个特定的应用程序在外观上没有基于帐户的变化(除了帐户条本身),我可以通过提供表单监听的自定义事件来处理功能变化——它们可以从服务器重新加载任何相关数据以响应它。

最佳答案

仅当您仅使用 URL 授权时,才能使用 UrlAuthorization.CheckUrlAccessForPrincipal。但是对于使用路由的 MVC,我们强烈建议您不要使用 URL 授权来保护应用程序。

相反,我们建议在 Controller 类上使用授权属性。原因是可能有多个 URL 调用相同的 Controller 操作。最好在资源处保护资源,而不仅仅是在入口处。

在这种特殊情况下,您必须获得给定 URL 的 Controller 实例。这有点棘手,因为您基本上必须从拥有 URL 的点到拥有 Controller 的点运行 MVC 管道。这是可能的,但似乎很重量级。

我想知道是否有更好、更简单的方法来实现您的目标。你到底想做什么?

更新:根据您的情况,这听起来像是仅用于 UI 目的的初始检查。也许您需要做的就是向 URL 发出异步 Ajax 请求并检查 HTTP 状态代码。如果是 401 状态代码,则您知道该用户未获得授权。这似乎是最安全的选择。

关于asp.net-mvc - ASP.Net MVC : Check if URL is Authorized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6480358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com