В проекте веб-API я переопределяю обычный процесс проверки подлинности, чтобы вместо этого проверять токены. Код выглядит примерно так:
if ( true ) // validate the token or whatever here
{
    var claims = new List<Claim>();
    claims.Add( new Claim( ClaimTypes.Name, "MyUser" ) );
    claims.Add( new Claim( ClaimTypes.NameIdentifier, "MyUserID" ) );
    claims.Add( new Claim( ClaimTypes.Role, "MyRole" ) );
    var claimsIdentity = new ClaimsIdentity( claims );
    var principal = new ClaimsPrincipal( new[] { claimsIdentity } );
    Thread.CurrentPrincipal = principal;
    HttpContext.Current.User = principal;
}
И затем, когда я применяю атрибут [Authorize] к контроллеру, он не может разрешить.
Код отладки подтверждает то же поведение:
// ALWAYS FALSE!
if ( HttpContext.Current.User.Identity.IsAuthenticated ) {
    // do something
}
Почему он думает, что пользователь не прошел аутентификацию, хотя я создал действительный элемент ClaimsIdentity и назначил его потоку?