我有一个包含所有登录数据的对象,它位于我的控制器中(在切换到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来从控制器访问登录。
答案 0 :(得分:2)
您可以使用 httpContext.User.Identity.IsAuthenticated 检查用户是否已登录。
要存储更多信息,您可以使用 httpContext.User 对象。您可以编写自己的 IPrincipal 和 IIdentity 的实现来存储各种登录信息。
其他选项是在会话中存储登录信息。
答案 1 :(得分:0)
您的LoginObject如何实例化?
如果它是通过服务或存储库(例如MyLoginObject = loginService.GetLogin()
)实例化的,那么您可以将此调用移动到CustomAuthorization属性中。
如果逻辑在控制器本身内,则应根据您的解决方案体系结构将其重构为服务或存储库,以便您可以执行上述操作。