Our senior developer wrote the following code, as an example:
public class TokenParser 
{
    private Token token;
    public Token Parse(HttpRequestMessage r)
    {
        IOwinContext context = r.GetOwinContext();
        token = new Token();
        ParseData(context);
        return token;
    }
    private void ParseData(IOwinContext context)
    {
        token.Name= context.Authentication.User.Claims.Single(x => x.Type == ClaimTypes.Name).Value;
    }
}
(There is also a "Token.cs" class that just has a name property as string.)
Our decoded JWT payload looks like this:
{
  "iss": "https://someissuer.com/",
  "sub": "I want this string, atm I get it manually",
  "aud": "11543fdsasf23432",
  "exp": 33244323433,
  "iat": 23443223434
}
The problem I run into is that when I try to get claim by Type "sub", nothing comes up (and it's not in the list). BUT "sub" seems to be an extremely common claim.
What am I doing wrong here? Go do I get the subject ("sub") claim?
Edit: For those recommending system.IdentityModel - I get this error when trying to use it:

 
    