自定义 ASP.Net 原则 - 无法将类型 'System.Security.Principal.GenericPrincipal' 的对象转换为类型 'Business.ICustomPri



我已经为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框架,那么它背后的对象通常是GenericPrincipalGenericPrincipal是.Net框架的一部分,它不能实现您的ICustomPrincipal接口。

如果您希望对User对象执行扩展方法以提取额外的数据,那么有几种不同的方法(使用声明就是其中之一)。但创建自己的CustomPrincipal已经成为过去,现在有更简单的方法可以做到这一点。

我发现这是用户未登录时造成的。我找到了两种解决方案:

  1. 当当前用户未登录时,不要尝试注入(在这个例子中很简单,因为我刚刚从我的登录控制器
  2. 注入一个处理返回当前用户的工厂类。无论用户是否登录,Ninject总是能够实例化和注入它。工厂类处理任何null异常等

我希望这能帮助其他人。

相关内容

  • 没有找到相关文章

最新更新