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.
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.
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);
} }
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();
}