从控制器继承并重定向

时间:2018-02-23 13:00:05

标签: c# asp.net-mvc inheritance

>基本上:如果没有会话,我需要去登录视图。

MVC - 从控制器继承并重定向,如果有的话,我需要访问任何url转到baseController并重定向登录,如果没有会话

我的问题是:从baseController检查后转到view方法并返回视图,如果没有会话我需要进入登录视图

BaseController:

public class BaseController : Controller
    {
        private HttpContextBase Context { get; set; }
        protected BaseController()
        {
            IsLogin();
        }
        [Authorize]
        public RedirectResult IsLogin()
        {
            if (System.Web.HttpContext.Current.Session["UserID"] != null &&
                Convert.ToInt32(System.Web.HttpContext.Current.Session["UserID"].ToString()) > 0)
            {
                //return Redirect(Request.UrlReferrer.AbsolutePath);
                return Redirect("/Admin/Users/Index");
            }
            else
            {
                return Redirect("/Admin/Default/Login");
            }
        }
    }

Controller继承自baseController:

public class UnitsController : BaseController 
    {
        protected BaseController baseInit;
        private SuperLinkContext db = new SuperLinkContext();
        // is inaccessible due to its protiction level
        // GET: Admin/Units
        public ActionResult Index()
        {
            var units = db.Units.Include(u => u.User);
            return View(units.ToList());
        }
}

1 个答案:

答案 0 :(得分:0)

有几种方法可以检查这一点,但您的解决方案有一些“设计缺陷”。 如果用[Authorize]装饰一个方法,这意味着他已经登录了。因此,无需在Session对象中检查userId。

另一方面,如果您[AllowAnonymous],则检查Session对象并不意味着用户已通过身份验证。您必须手动处理会话状态,如果您在注销或登录后忘记删除会话变量,则应用程序可能会出错。我倾向于在User对象中存储我需要的所有用户信息作为声明。通过这种方式,asp.net可以处理所有管道,在最基本的情况下,只需检查请求是否被授权。如果我需要更细粒度的调整,我可以应用策略来检查不同的声明。

如果您需要检查标识属性,请阅读用户声明:

var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;

如果您需要将用户重定向到您的登录表单,如果他没有登录,您可以在web.config中配置:

<authentication mode="Forms">
  <forms loginUrl="~/Admin/Default/Login" timeout="3600" />
</authentication>

现在,每当用户尝试访问受保护资源时,他都会自动重定向到您的登录表单。