MVC3 Custom AuthorizeAttribute:如何从控制器传入一个对象

时间:2011-06-21 22:05:56

标签: c# asp.net-mvc-3 authorize-attribute

我有一个包含所有登录数据的对象,它位于我的控制器中(在切换到MVC3之前已经编程)。

我正在尝试向网站添加授权,所以到目前为止我已经:

public LoginObject MyLoginObject
{
   get;
   set;
}

[CustomAuthorization()]
public ActionResult Index()
{
 return View();
}

public class CustomAuthorization : AuthorizeAttribute
{
   protected override bool AuthorizeCore(HttpContextBase httpContext)
   {
    return true;
    //should be return myLoginObject.IsLoggedIn;
   }
}

无论如何将MyLoginObject传递给AuthorizeAttribute类?如果没有,我至少可以从指定用户是否被授权的对象传入一个布尔值?

编辑:我的解决方案基于Zonnenberg的建议。

public class LoginObject : IPrincipal // Now extends IPrincipal 
{
   ... //old code
   private class IdentityImpl : IIdentity
{
  public string AuthenticationType
  {
    get;
    set;
  }

  public bool IsAuthenticated
  {
    get;
    set;
  }

  public string Name
  {
    get;
    set;
  }
}

public IIdentity Identity
{
  get { return new IdentityImpl { AuthenticationType = "Custom Authentication", IsAuthenticated = this.IsLoggedIn, Name = this.Id}; }
}
}

然后我将loginobject的实例化移动到CustomAuthorization

public override void OnAuthorization(AuthorizationContext filterContext)
{
  // ... Set up LoginObject
    filterContext.RequestContext.HttpContext.User = myLoginObject;

  base.OnAuthorization(filterContext);
}

所以现在登录是在授权内完成的,我可以调用User来从控制器访问登录。

2 个答案:

答案 0 :(得分:2)

您可以使用 httpContext.User.Identity.IsAuthenticated 检查用户是否已登录。

要存储更多信息,您可以使用 httpContext.User 对象。您可以编写自己的 IPrincipal IIdentity 的实现来存储各种登录信息。

其他选项是在会话中存储登录信息。

答案 1 :(得分:0)

您的LoginObject如何实例化?

如果它是通过服务或存储库(例如MyLoginObject = loginService.GetLogin())实例化的,那么您可以将此调用移动到CustomAuthorization属性中。

如果逻辑在控制器本身内,则应根据您的解决方案体系结构将其重构为服务或存储库,以便您可以执行上述操作。