7

我有一个名为 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

4 回答 4

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");;   
}

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

于 2013-07-10T11:15:20.250 回答
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),你可以在这里查看完整的解决方案。

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);
            }
        }
    }
}
于 2015-04-30T21:26:49.060 回答
1

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

于 2013-07-10T11:06:15.347 回答
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 的文章: 全局身份验证和允许匿名

于 2013-07-10T11:05:11.093 回答