4

我在我的第一个 MVC 项目中工作,但我遇到了身份验证问题。我有一个登录页面,可以通过我的活动目录正确验证用户。但是,即使经过身份验证,也不是所有用户都有权访问系统,所以我使用 web.config 中的一个部分来检查用户是否有权限。就像是:

<authorization>
   <allow users="john,mary,paul,bill,jane,anna" />
   <deny users="*" />
</authorization>

它工作正常,如果没有权限,用户总是被重定向到登录。但是,当我检查用户是否经过身份验证时,结果总是正确的。而且,在登录页面中,我想检查是否必须向已登录和授权的用户显示消息。就像是:

@if (User.Identity.IsAuthenticated && User.Identity.IsAuthorized)
{
   @Html.Partial("_Menu");   
}

所以...我该怎么做?

4

3 回答 3

5

身份验证和授权是两个不同的概念。身份验证意味着您知道此人是谁。授权意味着他们拥有特定的权限。

如果您想检查他们是否有权执行某些操作并为他们提供一个按钮或链接来执行该操作(或访问某些数据,无论它可能是什么),那么您必须使用其他方法检查他们是否具有权限方法。有关您的设置的更多细节将有助于更好地回答这个问题。

于 2013-04-09T19:29:06.100 回答
2

要进行身份验证,请检查您的 web.config 是否有此标记:

<authentication mode="Forms">//It cannot be "None"
    <forms loginUrl="~/MyLoginURL" timeout="2880" />
</authentication>

在您的登录方法中,对用户进行身份验证,确保您调用了任何 .NET 方法来验证用户的身份,例如:

using System.Web.Security;
FormsAuthentication.SetAuthCookie(login, boolean to cookie) // Or others FormsAuthentication methods that authenticate.

System.Web.Mvc 中有一个 AuthorizeAttribute,可以与您的操作或控制器一起使用,例如:

[Authorize]
public ActionResult Index()
{ ... }

或者

[Authorize]
public class HomeController 
{ ... }

此 AuthorizeAttribute 将检查当前用户是否已授权。您可以通过继承 AuthorizeAttribute 并覆盖 OnAuthorization 和 AuthorizeCore 创建自己的属性

于 2013-04-09T19:38:14.100 回答
2

一旦您执行成功登录 ( FormsAuthentication.SetAuthCookie),您的用户就会获得身份验证,因此直到您没有明确注销 ( FormsAuthentication.SignOut),这是正确的行为,因为所述身份验证和授权是两件不同的事情。

我想您只想向已通过 AD 身份验证的用户显示菜单,在这种情况下,您可以通过以下方式限制您的资源:

@if (User.Identity.IsAuthenticated)
{
   @Html.Partial("_Menu");   
}

如果获得授权,用户也会通过身份验证,因此无需进行双重检查。然后,您可以使用[Authorize]依赖于User.Identity.IsAuthorized.

当您可以使用角色对用户进行分组时,授权会派上用场。检查您的 ADusers 是否属于任何组,如果是,您可以执行以下操作:

<authorization>
  <allow users="*" allow role="yourdomain\yourgroup" />
  <deny users="*" />
</authorization>
于 2013-04-09T20:20:47.037 回答