检查用户是否获得授权

时间:2013-04-10 15:10:54

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

我需要能够确定用户在我的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从我的数据库中查找用户详细信息。我的服务是基于以下假设设计的:如果用户已经到了这么远,他们必须是授权用户,所以如果没有匹配的记录,我认为他们是新的(但是已授权的)用户并使用{{1创建新的用户记录为他们准备好以后再输入其余的细节。

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

我的第一个(幼稚)尝试解决此问题的方法是检查我的服务中的Identity.Name属性,但经过大量研究后,我已经了解了身份验证和授权之间的区别,并了解为什么这是不够的,因为它可能用户进行身份验证但未经授权。

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

有没有办法确定这个?

1 个答案:

答案 0 :(得分:0)

我决定不考虑身份验证或授权,而是考虑MVC管道。

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

我将服务初始化逻辑移动到Controller方法之前到基础实现(以便在执行操作方法之前初始化我的服务)。 如果用户被授权并经过身份验证,则MVC管道将仅调用此方法,从而为我提供所需的行为。