0

我需要能够确定我的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.Name)。

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

所以我基本上寻找的是类似于User.IsAuthenticated但是对于授权E.G. User.IsAuthorised。我的想法是,我会检查我的控制器,如果用户没有授权,我不会初始化服务。

有没有什么方法可以确定?

回答

0

我决定考虑这个问题,而不是在身份验证或授权方面,但在MVC管道方面。

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

我移动服务初始化逻辑进入OnActionExecuting方法之前到基实现(使得我的服务被初始化之前被执行的操作方法)。 如果用户同时授权和认证,MVC流水线只会调用此方法,并给予我所需的行为。

相关问题