Asp.Net MVC 4用户即使未经授权也会通过身份验证

时间:2013-04-09 19:26:14

标签: asp.net-mvc authentication authorization

我在我的第一个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");   
}

那么......我是怎么做到的?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

在您的LoginMethod中,对用户进行身份验证,请确保调用任何在其身份上对用户进行身份验证的.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来创建自己的属性

答案 2 :(得分:2)

成功登录后(FormsAuthentication.SetAuthCookie),您的用户将获得身份验证,直到您不明确注销(FormsAuthentication.SignOut)这是正确的行为,因为所述身份验证和授权是两个不同的事情。 / p>

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

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

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

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

<authorization>
  <allow users="*" allow role="yourdomain\yourgroup" />
  <deny users="*" />
</authorization>