.net webform 可以利用page 的事件进行统一身份验证,写一个类继承自System.Web.UI.Page ,里面实现验证,然后其它页面继承自这个类就可以实现验证了;;;
因为在mvc里没load事件,所以不能照搬,那么在.net mvc 里怎么实现呢? 曾听过有人说过类似的方法,但当时没注意。。而且还有另外一种方法。。
请问.net mvc 统一身份验证 怎么实现,有几种方法实现?
比如: 只需一次session判断,需要授权的control 或者action 就可以访问。
我想知道的是不用 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"];但是因为这里用到了内置的form验证,因此需要在登陆的代码里设置身份验证票证,而不是仅仅是把用户名放到Session里:
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);其中第二个参数是bool,表示下次是否自动登陆。不过不建议把敏感信息放到Session里。
自定义扩展实现以后,你只要把CustomAuthorize标记在任何Controller上面或Controller里面的方法上面,CustomAuthorize里面的代码就会在执行操作之前先执行。其实这也属于AOP编程的范畴,不修改原系统的逻辑,只是把功能添加到现有系统中,很先进的编程思想,比webform好太多。
验证票是什么,能否具体点.