允许匿名在asp.net mvc 3中调用某些操作

时间:2013-07-10 11:00:13

标签: asp.net-mvc asp.net-mvc-3

我有一个名为ForgetPassword的动作。每次匿名尝试检索操作时,他/她都会被重定向到登录页面。以下是我的实现。

public ActionResult ForgotPassword(string UserName)
{
    //More over when i place a breakpoint for the below line 
    //its not even getting here
    return View("Login");
}

这是我的web.config文件的一部分

    <location path="">
        <system.web>
          <authorization>
            <deny users="?"/>
          </authorization>
        </system.web>    
      </location>

  <location path="Content">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>    
  </location>

  <location path="Scripts">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>    
  </location>

  <location path="Images">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>    
  </location>

<authentication mode="Forms">
  <forms loginUrl="/Home/Login" timeout="5" slidingExpiration="false" />
</authentication>

4 个答案:

答案 0 :(得分:9)

正如你通过使用来拒绝所有人的申请。

<authorization>
    <deny users="?"/>
</authorization>

恕我直言,您不应使用web.config来控制应用程序的身份验证,而应使用Authorize属性。

Global.asax方法

下的RegisterGlobalFilters文件中添加此内容
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new AuthorizeAttribute()); //Added
}

或者您也可以使用[Authorize]

装饰您的控制器
[Authorize]
public class HomeController : Controller
{
    ...
}

如果您使用的是ASP.NET MVC4,对于需要匿名访问的操作,请使用AllowAnonymous属性

[AllowAnonymous]
public ActionResult ForgotPassword() {
    //More over when i place a breakpoint for the below line 
    //its not even getting here
    return View("Login");;   
}

根据Reference,您不能使用路由或web.config文件来保护您的MVC应用程序。保护MVC应用程序唯一受支持的方法是将Authorize属性应用于每个控制器,并在登录和注册操作上使用新的AllowAnonymous属性。根据当前区域做出安全决策是非常糟糕的事情,并会将您的应用程序打开到漏洞中。

答案 1 :(得分:3)

来自此链接http://weblogs.asp.net/jongalloway/asp-net-mvc-authentication-global-authentication-and-allow-anonymous

如果您使用的是MVC 3,则无法执行以下操作:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new AuthorizeAttribute());
}

为什么它的全局和 AllowAnonymous 属性不适用于 MVC 3

所以你需要建立自己的过滤器。它适用于我(MVC 3),您可以查看完整的解决方案here

using System.Web.Mvc;
using MvcGlobalAuthorize.Controllers;

namespace MvcGlobalAuthorize.Filters {
    public sealed class LogonAuthorize : AuthorizeAttribute {
        public override void OnAuthorization(AuthorizationContext filterContext)         {
            bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
            || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);
            if (!skipAuthorization) {
                base.OnAuthorization(filterContext);
            }
        }
    }
}

答案 2 :(得分:1)

我假设您在控制器上设置了“授权”属性,这将强制登录每个控制器操作。 我建议从控制器中删除该属性,并将其逐个设置为每个操作。 或者升级到MVC 4并使用AllowAnonymous属性。

答案 3 :(得分:0)

如果您使用的是ASP.NET MVC4,可以尝试在您的操作上添加allowanonymous属性,如下所示:

[AllowAnonymous]
public ActionResult ForgotPassword(string UserName)
{
    //More over when i place a breakpoint for the below line 
    //its not even getting here
    return View("Login");
}

有关更多信息,请查看Jon Galloway的文章: Global authentication and Allow Anonymous