如何在MVC应用程序中做一个非常简单的安全模型?

时间:2011-11-05 18:08:23

标签: asp.net-mvc asp.net-mvc-3

我想做类似以下的事情

if (Session["UserId"] == null)
            {
                RedirectToRoute("Default");
            }

因此,任何未被授予会话(通过我的登录页面)的人都将被踢出登录页面。我该如何做到这一点呢?

1)我选择的所选行动 2)如果需要,所有行动

2 个答案:

答案 0 :(得分:5)

最干净的方法是使用动作过滤器来实现它。这样的事情应该让你开始:

class UserLoggedInAttribute : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext) {
        if(filterContext.HttpContext.Session["UserId"] == null) {
            filterContext.Result = new RedirectToRouteResult("Default");
        }
    }
}

然后,只需使用此属性修饰控制器和/或操作:

[UserLoggedIn]
public class YourController {

}

答案 1 :(得分:4)

这是[Authorize]属性的默认行为。因此,您可以选择性地修饰需要此属性授权的控制器操作:

[Authorize]
public ActionResult SomeAction()
{
    ...
}

如果你想将它应用于多个动作,你可以编写一个基本控制器,然后用给定的属性装饰这个基本控制器。然后,从该基本控制器派生的所有子控制器和所有操作都需要授权才能被访问。

您还可以根据您可能具有的特定要求编写自定义授权属性。例如:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return httpContext.Session["UserId"] != null;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // if the user doesn't have the userid value in session
        // redirect him to the index action on the home controller
        var values = new { controller = "Home", action = "Index" };
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(values));
    }
}

然后用这个属性装饰需要遵循这个自定义授权逻辑的动作/控制器:

[MyAuthorize]
public ActionResult SomeAction()
{
    ...
}

现在,当您在登录操作中对用户进行身份验证时(显然不应使用任何authoraztion属性进行修饰),在有效凭据上,您可以将UserId属性添加到会话并重定向到本身的其他控制器操作用这个属性装饰,需要验证。

但是对于大多数情况,默认的Authorize属性就足够了。