2

我最近将基于表单的身份验证添加到 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>
4

2 回答 2

4

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

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

您可以将 添加AuthorizeAttributeGlobalFilterCollection,它是一组过滤器,可应用于控制器上的所有操作。然后,在您的控制器或操作上,您可以添加[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());
    }
}

这将要求每个控制器和操作默认使用授权。

您可以通过将以下内容添加到您的 Action 或 Controller 来使 Controller 或 Action 未经授权,就像这样。

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

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

或者

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

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

于 2013-06-17T18:54:10.510 回答
1

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

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

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

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

于 2013-06-17T17:22:09.300 回答