Как ClaimsIdentity.IsAuthenticated работает в реальном приложении?

#asp.net-core

#asp.net-core

Вопрос:

Я немного удивлен тем, как ClaimsPrincipal и ClaimsIdentity работают в ASP.NET Ядро и столкнулся с ситуацией, которая мне непонятна:

  • Может ли a ClaimsIdentity быть аутентифицирован ( IsAuthenticated = True) и иметь no претензии?
  • Могут ClaimsIdentity ли утверждения, не прошедшие проверку подлинности ( IsAuthenticated = False) but have ?

Я также не совсем уверен, как IsAuthenticated здесь работает: по-видимому, запрашивается только один тип. https://github.com/microsoft/referencesource/blob/master/mscorlib/system/security/claims/ClaimsIdentity.cs

Ответ №1:

AuthenticationType Свойство доступно только для чтения, поэтому вы можете выполнить ClaimsIdentity проверку подлинности, отправив его только при его создании:

 var authenticationType = "Signature";
var identity = new ClaimsIdentity(authenticationType);
  

Как вы можете видеть из источника, на который вы ссылались, IsAuthenticated свойство просто проверяет, что m_authenticationType оно существует.

Итак, ответ на оба ваших вопроса — «да».

Комментарии:

1. Да, до сих пор я мог видеть это в коде. Но поведение для меня неясно и важно для модульных тестов. When тип передается, и что происходит с утверждениями на основе типа? Я думаю, что каждое аутентифицированное утверждение имеет по крайней мере утверждение NameIdentifier . И всегда ли неаутентифицированный идентификатор без каких-либо претензий?

2. Это не имеет ничего общего с утверждениями, только с тем, существует ли тип аутентификации. И тип аутентификации может быть установлен только из конструктора. Итак, в модульном тестировании просто убедитесь, что вы отправляете тип аутентификации при создании экземпляра ClaimsIdentity (как показано в коде выше).

3. Спасибо, но это был не мой вопрос: -/ Я спросил о поведении , а не о том, как работает одна строка кода. Когда тип передается ASP.NET а когда нет? Будут ли установлены утверждения, если тип не передан? Другими словами, взаимодействие аутентификации и утверждений.

4. Нет необходимости понижать голос. Я ответил на оба ваших вопроса («да» на оба). Что касается поведения утверждений, вы можете видеть из источника, на который вы ссылались, что оба m_instanceClaims и m_externalClaims всегда инициализируются пустыми коллекциями (если утверждения также не отправляются в конструктор). Я не уверен, в чем может быть путаница.