我已经为ASP.Net标识实现了一个自定义原则,但当我试图从HttpContext.Current.User获取自定义原则时,我收到以下异常:
无法将"System.Security.Prinipal.GenericPrincipal"类型的对象强制转换为"VenuePortal.Business.ICustomPrincipal"."类型
我的实现是:
public interface ICustomPrincipal : IPrincipal
{
int UserID { get; set; }
string UserName { get; set; }
string Email { get; set; }
string AuthCode { get; set; }
string Title { get; set; }
}
public class CustomPrincipal : ICustomPrincipal
{
public int UserID { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string AuthCode { get; set; }
public string Title { get; set; }
public IIdentity Identity { get; private set; }
public bool IsInRole(string role) { return false; }
public CustomPrincipal(string email)
{
Identity = new GenericIdentity(email);
}
}
错误抛出了这个Ninject绑定:
kernel.Bind<ICustomPrincipal>().ToMethod(context => (ICustomPrincipal)HttpContext.Current.User).InRequestScope();
我在另一个(旧的)项目中也有同样的解决方案,所以我猜是某种框架变化影响了这一点HttpContext.Current.User似乎仍然返回一个IP原则,所以这一切不应该都起作用吗?
非常感谢您的帮助。
HttpContext.Current.User
确实实现了IPrincipal
,如果您使用的是Asp.Net Identity框架,那么它背后的对象通常是GenericPrincipal
。GenericPrincipal
是.Net框架的一部分,它不能实现您的ICustomPrincipal
接口。
如果您希望对User
对象执行扩展方法以提取额外的数据,那么有几种不同的方法(使用声明就是其中之一)。但创建自己的CustomPrincipal
已经成为过去,现在有更简单的方法可以做到这一点。
我发现这是用户未登录时造成的。我找到了两种解决方案:
- 当当前用户未登录时,不要尝试注入(在这个例子中很简单,因为我刚刚从我的登录控制器
- 注入一个处理返回当前用户的工厂类。无论用户是否登录,Ninject总是能够实例化和注入它。工厂类处理任何null异常等
我希望这能帮助其他人。