自定义ASP.Net原则 - 无法转换类型为#System; Security.Principal.GenericPrincipal'的对象。输入' Business.ICustomPrincipal'

时间:2015-12-02 16:26:59

标签: asp.net asp.net-identity iprincipal

我已经为ASP.Net标识实现了自定义原则,但是当我尝试从 HttpContext.Current.User 获取自定义原则时,我收到以下异常:

  

无法转换类型为#System; Security.Principal.GenericPrincipal'的对象。输入' VenuePortal.Business.ICustomPrincipal'。

我的实施是:

$first = new DateTime("2015/12/02 07:59:15");
$second = new DateTime("now");

if( $first > $second ) {
    //its bigger!
}

此Ninject绑定中出现错误:

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);
    }
}

我有同样的解决方案在另一个(较旧的)项目中工作,所以我猜测是否存在某种影响这种情况的框架变化? HttpContext.Current.User 似乎仍然会返回一个 IPrinciple ,所以不应该这样做吗?

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:1)

HttpContext.Current.User确实是实现IPrincipal,如果你使用的是Asp.Net Identity框架,那么它背后的对象通常是GenericPrincipalGenericPrincipal是.Net框架的一部分,它无法实现您的ICustomPrincipal界面。

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

答案 1 :(得分:0)

我发现这是在用户未登录时引起的。我找到了两个解决方案:

  1. 当用户未登录时,请勿尝试注入当前用户 (在这个例子中非常简单,因为我刚从中移除了属性 我的LoginController。
  2. 注入一个处理返回当前用户的工厂类。无论用户是否登录,Ninject始终能够实例化并注入此内容。工厂类处理任何null异常等。
  3. 我希望这有助于其他人。