【问题标题】:'Unable to cast object of type 'System.Security.Claims.ClaimsPrincipal' to type 'TestApp.SecurityUser'.' in asp.net core'无法将'System.Security.Claims.ClaimsPrincipal'类型的对象转换为'TestApp.SecurityUser'类型。'在 asp.net 核心中
【发布时间】:2019-11-11 04:03:29
【问题描述】:

我有一个自定义用户类,它继承自我的 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 是真的

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

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

    您不能将对象 A 的实例强制转换为对象 B.. 即使它们都实现了相同的接口。

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

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

    【讨论】:

    • 但是我的 asp.net 应用程序在同样的实现下正常工作
    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2022-01-22
    相关资源
    最近更新 更多