web-dev-qa-db-fra.com

Décoder manuellement le jeton porteur OAuth en c #

Dans mon application Web Api 2.2 OWIN, je suis dans une situation où j'ai manuellement besoin de décoder le jeton porteur, mais je ne sais pas comment faire cela . C'est mon startup.cs 

public class Startup
{
    public static OAuthAuthorizationServerOptions OAuthServerOptions { get; private set; }
    public static UnityContainer IoC;
    public void Configuration(IAppBuilder app)
    {
        //Set Auth configuration
        ConfigureOAuth(app);

        ....and other stuff
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new AuthProvider(IoC.Resolve<IUserService>(), IoC.Resolve<IAppSettings>())
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
}

Dans mon contrôleur, j'envoie le jeton de support en tant que paramètre 

[RoutePrefix("api/EP")]
public class EPController : MasterController
{
    [HttpGet]
    [AllowAnonymous]
    [Route("DC")]
    public async Task<HttpResponseMessage> GetDC(string token)
    {
        //Get the claim identity from the token here
        //Startup.OAuthServerOptions...

        //..and other stuff
    }
}

Comment décoder manuellement et obtenir les revendications du jeton passé en paramètre? 

NOTE: Je sais que je peux envoyer le jeton dans l'en-tête et utiliser [Autoriser] et (ClaimsIdentity) User.Identity etc., mais la question est de savoir comment lire le jeton s'il n'est pas présenté dans l'en-tête. 

7
Marcus Höglund

J'ai créé un exemple de projet de désérialisation des jetons de support cryptés à l'aide de MachineKeyDataProtector . Vous pouvez consulter le code source.

désérialiseur au porteur

4
Legends

Il suffit de placer ceci ici pour les autres qui pourraient rendre visite à l’avenir. La solution trouvée sur https://long2know.com/2015/05/decrypting-owin-authentication-ticket/ est plus simple.

Juste 2 lignes:

var secureDataFormat = new TicketDataFormat(new MachineKeyProtector());
AuthenticationTicket ticket = secureDataFormat.Unprotect(accessToken);



private class MachineKeyProtector : IDataProtector {
    private readonly string[] _purpose =
    {
        typeof(OAuthAuthorizationServerMiddleware).Namespace,
        "Access_Token",
        "v1"
    };

    public byte[] Protect(byte[] userData)
    {
        throw new NotImplementedException();
    }

    public byte[] Unprotect(byte[] protectedData)
    {
        return System.Web.Security.MachineKey.Unprotect(protectedData, _purpose);
    } }
10
Osa E

Vous pouvez lire JWT et créer des principaux et des objets d'identité à l'aide du package System.IdentityModel.Tokens.Jwt - https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/

Voici un exemple rapide montrant les options disponibles lors de la lecture et de la validation du jeton, 

    private ClaimsIdentity GetIdentityFromToken(string token, X509Certificate2 certificate)
    {  
        var tokenDecoder = new JwtSecurityTokenHandler();         
        var jwtSecurityToken = (JwtSecurityToken)tokenDecoder.ReadToken(token);

        SecurityToken validatedToken;

        var principal = tokenDecoder.ValidateToken(
            jwtSecurityToken.RawData,
            new TokenValidationParameters()
                {
                    ValidateActor = false,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidateLifetime = false,
                    ValidateIssuerSigningKey = false,
                    RequireExpirationTime = false,
                    RequireSignedTokens = false,
                    IssuerSigningToken = new X509SecurityToken(certificate)
                },
            out validatedToken);

        return principal.Identities.FirstOrDefault();
    }
0
Dylan Morley