Asp.net mvc 如何在MVC应用程序中实现真正简单的安全模型?

Asp.net mvc 如何在MVC应用程序中实现真正简单的安全模型?,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我想做类似于以下的事情 if (Session["UserId"] == null) { RedirectToRoute("Default"); } 因此,任何未被授予会话(通过我的登录页面)的人都将被踢出登录页面。我该怎么做才能让它发生 1) 我选择的行动 2) 如果需要,所有操作都是,这是属性的默认行为。因此,您可以通过此属性有选择地修饰需要授权的控制器操作: [Authorize] public Action

我想做类似于以下的事情

if (Session["UserId"] == null)
            {
                RedirectToRoute("Default");
            }
因此,任何未被授予会话(通过我的登录页面)的人都将被踢出登录页面。我该怎么做才能让它发生

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

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

[Authorize]
public ActionResult SomeAction()
{
    ...
}
[MyAuthorize]
public ActionResult SomeAction()
{
    ...
}
[UserLoggedIn]
public class YourController {

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

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

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));
    }
}
然后使用此属性装饰需要遵循此自定义授权逻辑的操作/控制器:

[Authorize]
public ActionResult SomeAction()
{
    ...
}
[MyAuthorize]
public ActionResult SomeAction()
{
    ...
}
[UserLoggedIn]
public class YourController {

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


不过在大多数情况下,默认的Authorize属性就足够了。

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

class UserLoggedInAttribute : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext) {
        if(filterContext.HttpContext.Session["UserId"] == null) {
            filterContext.Result = new RedirectToRouteResult("Default");
        }
    }
}
然后,只需使用以下属性装饰控制器和/或操作:

[Authorize]
public ActionResult SomeAction()
{
    ...
}
[MyAuthorize]
public ActionResult SomeAction()
{
    ...
}
[UserLoggedIn]
public class YourController {

}

您是否特别讨厌使用内置的FormsAuthentication来为您完成所有这些工作?