如何在MVC3上使用authorize属性

时间:2011-12-20 14:52:31

标签: asp.net-mvc-3

我已经读过要在MVC上使用属性[Authorize],你只需将它放在一个动作或你要保护的控制器类上。

我的问题是:Authorize属性如何知道用户是否已登录?我是否必须提供任何Session对象才能让Authorize知道用户是否获得授权?

2 个答案:

答案 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;
    }

这是some more info on FormsAuthentication

答案 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文件夹中。