【问题标题】:Check if user is authorized检查用户是否被授权
【发布时间】:2013-04-10 15:10:53
【问题描述】:

我需要能够确定用户是否在我的 ASP.net MVC 3 应用程序中获得授权(未通过身份验证)。

我有一个使用 Windows 身份验证对用户进行身份验证的 Intranet 应用程序。只有“allowedUsers”组中的用户才能访问该站点,这是通过AuthorizeAttribute 强制执行的,如下所示:

[Authorize(Roles="allowedUsers")]
public abstract class BaseController : Controller

这按预期工作,并且不向组中的任何用户提供访问该站点的权限。到目前为止,一切顺利。

但是,在用户通过身份验证但未授权的情况下,我现在遇到了问题。请允许我解释一下:

在我的BaseController 中,我覆盖了Initialize 方法。在这里,我使用控制器所需的任何依赖项设置我的域服务,其中之一是 User.Identity 对象。

Service.Initialize(User.Identity);

在我的服务中,我使用Identity.Name 从我的数据库中查找用户详细信息。我的服务是在这样的假设下设计的准备好让他们稍后输入其余的详细信息。

问题出现在用户通过身份验证但未授权的情况下;在这种情况下,用户被拒绝访问页面,但控制器仍在幕后实例化并初始化服务。该服务永远不会在数据库中找到匹配项(因为用户不应该具有访问权限)并创建新的用户记录。这给我留下了大量不应该访问的用户的记录(只填写了Identity.Name)。

我第一次(天真的)尝试解决这个问题是检查我的服务中的Identity.IsAuthenticated 属性,但是,经过大量研究后,我了解了身份验证和授权之间的区别,并理解了为什么这是不够的,因为它是可能的用户被认证但未被授权。

所以我基本上在寻找类似于User.IsAuthenticated 的东西,但用于授权 E.G. User.IsAuthorised。这个想法是我将在我的控制器中检查这一点,如果用户未获得授权,我将不会初始化服务。

有什么方法可以确定吗?

【问题讨论】:

    标签: asp.net-mvc-3 authentication authorization windows-authentication


    【解决方案1】:

    我决定不从身份验证或授权的角度考虑这个问题,而是从 MVC 管道的角度考虑这个问题。

    我的问题来自这样一个事实,即我在ControllerInitialize 方法中初始化我的服务,即使用户未获得授权,该方法似乎也会被调用。这让我清楚地知道,在调用任何操作方法之前,我的服务的初始化需要在控制器的生命周期中尽可能晚地进行。

    我将服务初始化逻辑移动到OnActionExecuting 方法之前 到基本实现(以便在执行操作方法之前初始化我的服务)。 只有当用户获得授权和身份验证时,MVC 管道才会调用此方法,从而为我提供所需的行为。

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2012-08-20
      相关资源
      最近更新 更多