我已经读过要在MVC上使用属性[Authorize]
,你只需将它放在一个动作或你要保护的控制器类上。
我的问题是:Authorize
属性如何知道用户是否已登录?我是否必须提供任何Session对象才能让Authorize
知道用户是否获得授权?
答案 0 :(得分:15)
此属性的工作原理是查看HttpContext.User.Identity.IsAuthenticated
。
如果您使用的是FormsAuthentication,如果用户的计算机上有一个有效的FormsAuthentication cookie(您可以使用FormsAuthentication.SetAuthCookie
添加),则会将其设置为true。
如果您对Authorize
的内部工作感兴趣,则来自已发布的Microsoft源代码:
protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
if (httpContext == null) {
throw new ArgumentNullException("httpContext");
}
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated) {
return false;
}
if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) {
return false;
}
if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) {
return false;
}
return true;
}
答案 1 :(得分:3)
默认情况下,授权属性类将httpcontext作为参数。什么时候叫。然后它检查HttpContext.User.Identity.IsAuthenticated bool值并相应地采取行动。仅当您使用Forms身份验证时,此方法才有效如果您使用自己的登录逻辑(例如在会话对象中),则可以从Authorize Attribute派生一个类并调用它。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
clsSession sess = httpContext.Session["Current"] as clsSession;
if (sess.IsLogin) return true;
return false;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new ViewResult { ViewName = "Unauthorized" };
}
}
然后你可以像这样使用这个类:
[MyAuthorize]
public ActionResult Index()
{
return View();
}
这会奏效。您可以在所有控制器操作中使用[MyAuthorize]而不是[Authorize]。如果返回false,则返回视图(在本例中为“Unauthorized”)。视图名称可以是任何内容,可以位于views / shared文件夹中。