Asp.net 应用程序\u AuthenticateRequest无限循环
我最近在一个MVC3项目中添加了基于表单的身份验证。我的应用程序_AuthenticateRequest函数(Global.asax.cs文件)和我的Web.Config文件的设置之间似乎存在问题,因为我的应用程序_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
//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();
}
}