在MVC中有一个名为AuthorizeAttribute的类,我们可以创建我们自己的特性MemberValidationAttribute类,然后继承AuthorizeAttribute类来实现我们自己的网站权限的管理。然后通过将MemberValidation特性添加到具体的Action上,将我们的权限管理精确到某个页面上。
下面我通过一个例子了解一下。
首先我们创建一个空的MVC项目。创建两个Controller和三个页面。
主页Controller
复制代码
public class HomeController : Controller { // // GET: /Home/
public ActionResult Index() { return View(); }
}
复制代码
页面
用户登录Controller,在Login Action下添加 Cookie写入代码。
复制代码
public class MemberController : Controller { // // GET: /Member/ public ActionResult Index() { return View(); } public ActionResult Login() { var cookie = new HttpCookie("Login", "Success"); System.Web.HttpContext.Current.Response.SetCookie(cookie); return View("LoginSuccess"); } }
复制代码
页面
以上三个截图的关系是,我们希望用户先是通过登录页面登录,提示成功后,在进入Home页面。但是这时我们通过在地址栏内输入"/Home"也可以登录到主页面,那也许就会报错。在我做的上个项目中,就是需要对用户的批量下单做一个验证,如果有没通过验证的订单是不让用户通过在地址栏输入地址跳转到订单结算页面的,不然是会报错的。这里就需要我们将针对某一页面的验证添加到相应的Action上去。
下面我们添加一个名为MemberValidationAttribute类,让他继承AuthorizeAttribute类,这里我们只需要实现他的OnAuthorization方法
复制代码
public class MemberValidationAttribute:AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { //获取Cookies中的Login var memberValidation = System.Web.HttpContext.Current.Request.Cookies.Get("Login"); //如果memberValidation为null 或者 memberValidation不等于Success if (memberValidation==null||memberValidation.Value != "Success") { //页面跳转到 登录页面 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {controller="Member",action="Index" })); return; } //通过验证 return; } }
复制代码
然后将特性添加到HomeController下的Index Action上。
复制代码
public class HomeController : Controller { [MemberValidation] public ActionResult Index() { return View(); } }
复制代码
这下再怎么通过Url去跳转的话也不能再不通过登录的情况下进入我们的Home Index 页面了。
有两个遗留问题要在这里说一下:
第一:登录成功的页面并没有添加一个跳转到Home Index的 按钮,所以登录成功后还是要通过Url 到Home Index去。
第二:用户登录的时候将Cookie Login 清空。
2013-5-22 遗留问题一
在AuthorizeAttribute中还有一个方法叫AuthorizeCore,他返回一个bool值表示是否通过验证。通过验证的话跳转到下一页面A,如果未通过验证,则跳转到登录页面。 复制代码
protected override bool AuthorizeCore(HttpContextBase httpContext) {
var cook = System.Web.HttpContext.Current.Request.Cookies.Get("CustomerInfo");
if (cook != null) { if (cook.ToString() != "") { return true; }
} return false; }
复制代码
登录页面的设置在web.config中。如下:
<system.web> <authentication mode="Forms"> <forms loginUrl="~/Account/LoginPage" timeout="2880" /> </authentication> </system.web>
loginUrl就是要跳转到的登录页面,这是在url地址栏会携带A的地址,作为登录成功后的跳转。 复制代码
public ActionResult LoginPage(string ReturnUrl) { if (ReturnUrl != null) ViewBag.ReturnUrl = ReturnUrl; return View(); }
复制代码
|