«Невозможно привести объект типа« System.Security.Claims.ClaimsPrincipal »к типу« TestApp.SecurityUser ». 'в ядре asp.net - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть пользовательский класс пользователя, который наследуется от класса ClaimsPrincipal в моем основном приложении asp.net, как это

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 голосов
/ 10 ноября 2019

Ваш класс SecurityUser реализует правильный интерфейс, но это не означает, что экземпляр в HttpContext.User действительно является экземпляром SecurityUser.

Нельзя приводить экземпляр объекта A к объекту B .. несмотря на то, что они оба реализуют один и тот же интерфейс.

Интерфейс - это просто средство для доступа к определенному объекту без необходимости знать, что это за объект на самом деле.

То, что вы, вероятно, здесь хотитеявляются методами расширения, чтобы добавить необходимую вам функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...