'无法将类型为'System.Security.Claims.ClaimsPrincipal'的对象转换为类型为'TestApp.SecurityUser'。在asp.net核心中

时间:2019-11-10 18:46:56

标签: c# asp.net-core

我有一个自定义用户类,它继承自我的asp.net核心应用程序中的ClaimsPrincipal类

public class SecurityUser : ClaimsPrincipal
{
   private bool _isOwnerUser  =false;
   public bool IsOwnerUser
   {
      get { return _isOwnerUser; }
   }
}

然后在我的控制器中,我试图像这样将我的主要要求投给我的自定义SecurityUser

public class HomeController : Controller
{
  protected SecurityUser SecurityUser
  {
    get
    {
       if (HttpContext.User.Identity.IsAuthenticated) return (SecurityUser)HttpContext.User;
       else return null;
    }
  }
}

但是,我遇到了错误

  

无法将类型为“ System.Security.Claims.ClaimsPrincipal”的对象转换为类型为“ TestApp.SecurityUser”。

,这意味着ClaimsPrincipal无法转换为我的自定义安全用户。

我不明白为什么这不可能,因为在我的asp.net应用程序中,SecurityUser类继承自IPrincipal,并且我能够像这样进行投射

protected  SecurityUser SecurityUser
{
  get
  {
    if (this.HttpContext.User.Identity.IsAuthenticated) return (SecurityUser)this.HttpContext.User;
    else return null;
  }
}

HttpContext.User.Identity.IsAuthenticated是真的

1 个答案:

答案 0 :(得分:0)

您的SecurityUser类实现了正确的接口,但这并不意味着HttpContext中的实例。User确实是SecurityUser的实例。

即使对象A和B实现相同的接口,也不能将对象A的实例强制转换为对象B。

接口只是访问特定对象的一种手段,而不必知道实际上是哪种对象。

您可能想要的是扩展方法,以添加所需的功能。