>基本上:如果没有会话,我需要去登录视图。
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());
}
}
答案 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>
现在,每当用户尝试访问受保护资源时,他都会自动重定向到您的登录表单。