asp.net MVC被自定义属性创建搞糊涂了

时间:2009-11-07 14:16:24

标签: asp.net-mvc attributes

嗨我正在尝试为我的MVC应用程序创建自定义属性,以便我可以调用[CheckLogin]这是检查我的cookie,因为我没有使用表单验证。

我创建了一个类CheckLogin,它位于我的App_Code文件夹中,代码如下:

using System.Web.Mvc;
using System.Attributes;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Web;
using System;

namespace corian_MVC.Controllers
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    public class CheckLoginAttribute : FilterAttribute, IAuthorizationFilter
    {
        public CheckLoginAttribute() {}

        public void OnAuthorization(AuthorizationContext filterContext)
        {
            // TODO: perform your cookie checks
            if (!userIsAuthenticated)
            {
                filterContext.Result = new RedirectResult(string.Format(
                          "/Admin/Login",
                          filterContext.HttpContext.Request.Url.AbsoluteUri));
            }
        }
    }
}

它的作用在这里并不重要,问题是我不能让我的代码识别这个属性,如果它首先是一个,如果登录失败我如何重定向到行动????

非常感谢

我的管理员课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;


namespace corian_MVC.Controllers
{
    [HandleError]
    public class AdminController : Controller
    {
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index()
        {
            //check login is not banned

            if ((int)Session["LoginCount"] >= 3) RedirectToAction("TooMany");

            return View();
        }

        public ActionResult Fraud()
        {
            Session["LoginCount"] = 3;
            return View();
        }

        public ActionResult TooMany()
        {
            return View();
        }

        [CheckLogin]
        public ActionResult Welcome()
        {
            return View();
        }

        private void Createcookie()
        {

        }

    }
}

2 个答案:

答案 0 :(得分:2)

最好通过实施IAuthorizationFilter来处理此方案。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited=true, AllowMultiple=true)]
public class CheckLoginAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        // TODO: perform your cookie checks
        if (!userIsAuthenticated)
        {
            filterContext.Result = new RedirectResult(string.Format(
                "/loginUrl?ReturnUrl={0}",  
                filterContext.HttpContext.Request.Url.AbsoluteUri));
        }
    }
}

然后,您可以在控制器级别或某些特定操作中应用此属性。

顺便说一句,你有什么特别的理由不使用内置的FormsAuthentication吗?

答案 1 :(得分:-1)

将包含您的属性的.cs文件包含在解决方案中。只是把它“放在default.aspx附近”是不够的。