MVC2 ::我如何*使用*自定义IIdentity类?
我试图从web服务中存储一整套有关用户的信息。 由于这是关于当前通过身份验证的用户的信息,我认为将这些信息存储在自定义IIdentity实现中是有意义的。
自定义MagicMembershipProvider.GetUser(string id, bool userIsOnline)
调用webservice并返回一个MagicMembershipUser
实例,其中填充了所有字段(部门,电话号码,其他员工信息)。
自定义成员资格提供程序和自定义成员资格用户都正常工作
将成员资格用户信息放入可在每个控制器中访问的IPrincipal User
对象的最佳方式是什么以及哪里?
我一直试图围绕MVC2应用程序中IIdentity,IPrincipal和Role授权的安全程序流程 - 但我真的在这里苦苦挣扎,可以使用一些指导。 有关于部件的Internet Ton文章,但对整体而言并不多。
编辑
我迄今为止的最佳猜测是在FormsAuthenticationService
分配HttpContext.Current.User
:
public void SignIn(string userName, bool createPersistentCookie)
{
if (String.IsNullOrEmpty(userName))
throw new ArgumentException("Value cannot be null or empty.", "userName");
try
{
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
MagicMembershipUser magicUser = _provider.GetUser("", false)
as MagicMembershipUser;
MagicIdentity identity = new MagicIdentity(userName, magicUser);
GenericPrincipal principal = new GenericPrincipal(identity, null);
HttpContext.Current.User = principal;
}
catch (Exception)
{
throw;
}
}
将成员资格用户信息放入可在每个控制器中访问的IPrincipal用户对象的最佳方式是什么以及哪里?
在自定义[Authorize]
过滤器实现中。 您可以重写AuthorizeCore方法并调用基本方法,如果它返回true,则查询您的成员资格提供程序并将自定义魔法标识注入上下文中。
例:
public class MagicAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (isAuthorized)
{
var username = httpContext.User.Identity.Name;
var magicUser = _provider.GetUser(username, false) as MagicMembershipUser;
var identity = new MagicIdentity(username, magicUser);
var principal = new GenericPrincipal(identity, null);
httpContext.User = principal;
}
return isAuthorized;
}
}
现在剩下的就是用[MagicAuthorize]
属性来装饰你的基础控制器。