Asp.net 应用程序\u AuthenticateRequest无限循环

Asp.net 应用程序\u AuthenticateRequest无限循环,asp.net,asp.net-mvc,c#-4.0,global-asax,Asp.net,Asp.net Mvc,C# 4.0,Global Asax,我最近在一个MVC3项目中添加了基于表单的身份验证。我的应用程序_AuthenticateRequest函数(Global.asax.cs文件)和我的Web.Config文件的设置之间似乎存在问题,因为我的应用程序_AuthenticateRequest函数似乎被无限次调用。如何更改配置以使其正常工作?如何允许用户访问登录页面和默认页面,同时仍拒绝访问其他页面 //Global.asax.cs protected void Application_AuthenticateRequ

我最近在一个MVC3项目中添加了基于表单的身份验证。我的应用程序_AuthenticateRequest函数(Global.asax.cs文件)和我的Web.Config文件的设置之间似乎存在问题,因为我的应用程序_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>
//Global.asax.cs
受保护的无效应用程序\u AuthenticateRequest(对象发送方,事件参数e)
{
//提取表单身份验证cookie
字符串cookieName=FormsAuthentication.FormsCookieName;
HttpCookie authCookie=Context.Request.Cookies[cookieName];
if(null==authCookie)
{
//没有身份验证cookie。
返回;
}
FormsAuthenticationTicket authTicket=null;
尝试
{
authTicket=FormsAuthentication.Decrypt(authCookie.Value);
}
捕获(例外情况除外)
{
//日志异常详细信息(为简单起见省略)
返回;
}
if(null==authTicket)
{
//Cookie无法解密。
返回;
}
string[]roles=authTicket.UserData.Split(“|”);
//创建标识对象
FormsIdentity id=新FormsIdentity(authTicket);
//此主体将在整个请求中流动。
UserPrincipal=新的UserPrincipal(id、角色);
//将新主体对象附加到当前HttpContext对象
Context.User=principal;
Thread.CurrentPrincipal=主体;
}
//Web.Config

这将为每个请求调用,而不仅仅是在用户第一次登录时

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

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


根据罗布回答的评论

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

您可以向添加
authorized属性
,该属性是应用于控制器上所有操作的过滤器集合。然后,在您的控制器或操作上,您可以将
[AllowAnonymous]
添加到您希望任何人访问的特定控制器或操作中。请参见下面的示例

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

如果已经存在,只需添加以下行:
filters.add(newauthorizeAttribute())

这将要求每个控制器和操作在默认情况下使用授权

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

[AllowAnonymous]
public class MyController
{
    public ActionResult MyAction()
    {
        return View();
    }
}
该控制器中的所有操作都将可用

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

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

当用户第一次进入默认页面时,应将其重定向到注册页面以进行注册。所以从技术上讲,我需要所有的页面封锁,除了默认,登录和注册页面。这是否意味着我必须每隔一页添加Authorize属性?此外,如果是这种情况,我将在哪里验证身份验证票证?同样,我建议阅读演练。但是,您可以将[Authorize]属性添加到只有登录的人才能访问的所有内容中。您可以将其添加到整个控制器(这反过来使控制器中的所有方法都需要授权)或仅添加到方法本身。当我从Web.Config中删除表单身份验证时,Request.IsAuthenticated似乎总是返回true。根据变量的值,我想隐藏某些页面的某些区域。如何确保Request.IsAuthenticated具有正确的值?在使用Authorize属性时,应该在其中包含表单身份验证。如果您有一个公共视图,并且希望隐藏某些内容,那么应该在视图中使用类似于
@If(Request.IsAuthenticated){authenticated stuff on page here}
的内容。
public class MyController
{
    [AllowAnonymous]
    public ActionResult MyAction()
    {
        return View();
    }
}