asp.net mvc 统一身份验证问题、怎么实现?

.net webform 可以利用page 的事件进行统一身份验证,写一个类继承自System.Web.UI.Page ,里面实现验证,然后其它页面继承自这个类就可以实现验证了;;;

因为在mvc里没load事件,所以不能照搬,那么在.net mvc 里怎么实现呢? 曾听过有人说过类似的方法,但当时没注意。。而且还有另外一种方法。。

请问.net mvc 统一身份验证 怎么实现,有几种方法实现?
比如: 只需一次session判断,需要授权的control 或者action 就可以访问。

MVC里有AuthorizeAttribute特性,直接标记在Controller类上或者在控制器操作上。
[Authorize]
public class ArticleController : Controller
{
[Authorize]
public ActionResult Index()
{
return View();
}
}

如果用户没有登录,就会跳转到登录页面。也可以自定义扩展AuthorizeAttribute,实现自定义的验证。建议你买本书看,一两句话说不清楚。追问

我想知道的是不用 mvc 的Authorize特性, 如果有多个不同登录验证,返回的也是多个不同页面,那用Authorize 好像不好使。

追答

可以的,自定义扩展一下就行了:
public class CustomAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("HttpContext");
}
if (!httpContext.User.Identity.IsAuthenticated)
{
return false;
}

string userName = httpContext.User.Identity.Name
///根据用户名从数据库中获取用户,实现自定义验证。

return false;
}

public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
{
///

base.OnAuthorization(filterContext);
}
}

MVC中的验证要比webform灵活,而且我认为这种方法要比webform中自定义类继承System.Web.UI.Page更好。

追问

我也想研究使用 Attribute ,但是还不太了解用法,请问 这个可以使用session 判断么?

追答

你可以在登陆的时候把用户信息放到Session里,然后在扩展里获取:

string userName=httpContext.Session["UserName"];
string department=httpContext.Session["DepartmentName"]; //假设有个用户部门信息

但是因为这里用到了内置的form验证,因此需要在登陆的代码里设置身份验证票证,而不是仅仅是把用户名放到Session里:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

其中第二个参数是bool,表示下次是否自动登陆。不过不建议把敏感信息放到Session里。


自定义扩展实现以后,你只要把CustomAuthorize标记在任何Controller上面或Controller里面的方法上面,CustomAuthorize里面的代码就会在执行操作之前先执行。其实这也属于AOP编程的范畴,不修改原系统的逻辑,只是把功能添加到现有系统中,很先进的编程思想,比webform好太多。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-29
用验证票,只要没登入,不管进哪个页都会自动转到登入页的。追问

验证票是什么,能否具体点.