Application_AuthenticateRequest无限循环

时间:2013-06-17 16:59:22

标签: asp.net asp.net-mvc c#-4.0 global-asax

我最近在MVC 3项目中添加了基于表单的身份验证。我的Application_AuthenticateRequest函数(Global.asax.cs文件)与我的Web.Config文件的设置之间似乎存在问题,因为我的Application_AuthenticateRequest函数似乎无限调用。如何更改配置以使其正常工作,如何允许用户访问登录页面和默认页面,同时仍然拒绝访问其他页面?

    //Global.asax.cs
    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        // Extract the forms authentication cookie
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = Context.Request.Cookies[cookieName];

        if (null == authCookie)
        {
            // There is no authentication cookie.
            return;
        }

        FormsAuthenticationTicket authTicket = null;
        try
        {
            authTicket = FormsAuthentication.Decrypt(authCookie.Value);
        }
        catch (Exception ex)
        {
            // Log exception details (omitted for simplicity)
            return;
        }

        if (null == authTicket)
        {
            // Cookie failed to decrypt.
            return;
        }

        string[] roles = authTicket.UserData.Split('|');

        // Create an Identity object
        FormsIdentity id = new FormsIdentity(authTicket);

        // This principal will flow throughout the request.
        UserPrincipal principal = new UserPrincipal(id, roles);
        // Attach the new principal object to the current HttpContext object
        Context.User = principal;
        Thread.CurrentPrincipal = principal;
}

//Web.Config
<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" 
         protection="All"
         cookieless="UseCookies"
         slidingExpiration="false"
         timeout="30" />
</authentication>

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

2 个答案:

答案 0 :(得分:4)

根据Rob的回答评论......

  

“从技术上讲,我需要阻止所有页面,除了默认,登录和注册页面。”

您可以将AuthorizeAttribute添加到GlobalFilterCollection,{{3}}是一组过滤器,可应用于控制器上的所有操作。然后,在您的控制器或操作上,您可以将[AllowAnonymous]添加到您希望任何人访问的特定组件。请参阅下面的示例。

在App_Start文件夹中创建名为FIlterConfig.cs的文件

如果已经存在,只需添加以下行:filters.Add(new AuthorizeAttribute());

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

这将要求每个Controller和Action默认使用授权。

您可以通过将以下内容添加到操作或控制器中来使控制器或操作未获得授权。

[AllowAnonymous]
public class MyController
{
    public ActionResult MyAction()
    {
        return View();
    }
}

该控制器中的所有操作都可用。

public class MyController
{
    [AllowAnonymous]
    public ActionResult MyAction()
    {
        return View();
    }
}

只有控制器上的操作可用。

答案 1 :(得分:1)

这将针对每个请求进行调用,而不仅仅是在用户第一次登录时。

您可以使用[Authorize]属性来限制对某些控制器甚至方法的访问。

我建议查看一些教程或文档,以了解身份验证在MVC中的工作原理:

http://msdn.microsoft.com/en-us/library/ff398049(v=vs.98).aspx