2011-01-17 10 views
5

Estamos implementando STS (autenticación basada reclamo) de los servicios basados ​​en REST. Una de las razones entre muchas cuando decidimos crear servicios REST (con JSON) fue la pequeña huella sobre el cable. Con STS, el token de SAML con solo unos pocos reclamos el tamaño de SAML se convierte en pocos K bytes. Para la mayoría de las llamadas REST donde no estamos devolviendo la lista de objetos, el tamaño de respuesta es de 100s bytes bajos y para esas llamadas este token parece demasiado alto. ¿Cómo manejas esto en tus proyectos?SAML tamaño de símbolo y REST

Respuesta

0

Puede utilizar SAML fichas con puntos finales REST, pero más a menudo se encuentran las personas que usan tokens web simple (SWT) en su lugar. Más pequeño, más simple, etc.

ACS (Servicio de Control de Acceso en la plataforma Windows Azure) implementa esto, por ejemplo.

+0

Parece que SWT no avanza. JWT también está en la infancia. Parece que tenemos que lidiar con SAML por ahora. http://startersts.codeplex.com/discussions/242113?ProjectName=startersts –

2

... O JWT (JSON Web Token). ACS también los admite. Comprobar este artículo: JSON Web Token Handler for the Microsoft .NET Framework 4.5 Aquí es un ejemplo de uso de esta biblioteca con .Net 4.5 que las cuestiones y valida una JWT firmó con SHA256 HMAC basada en una clave simétrica.

string jwtIssuer = "MyIssuer"; 
string jwtAudience = "MyAudience"; 

// Generate symmetric key for HMAC-SHA256 signature 
RNGCryptoServiceProvider cryptoProvider = new RNGCryptoServiceProvider(); 
byte[] keyForHmacSha256 = new byte[64]; 
cryptoProvider.GetNonZeroBytes(keyForHmacSha256); 

/////////////////////////////////////////////////////////////////// 
// Create signing credentials for the signed JWT. 
// This object is used to cryptographically sign the JWT by the issuer. 
SigningCredentials sc = new SigningCredentials(
           new InMemorySymmetricSecurityKey(keyForHmacSha256), 
           "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256", 
           "http://www.w3.org/2001/04/xmlenc#sha256"); 

/////////////////////////////////////////////////////////////////// 
// Create token validation parameters for the signed JWT 
// This object will be used to verify the cryptographic signature of the received JWT 
TokenValidationParameters validationParams = 
    new TokenValidationParameters() 
    { 
     AllowedAudience = s_jwtAudience, 
     ValidIssuer = s_jwtIssuer, 
     ValidateExpiration = true, 
     ValidateNotBefore = true, 
     ValidateIssuer = true, 
     ValidateSignature = true, 
     SigningToken = new BinarySecretSecurityToken(keyForHmacSha256), 
    }; 

/////////////////////////////////////////////////////////////////// 
// Create JWT handler 
// This object is used to write/sign/decode/validate JWTs 
JWTSecurityTokenHandler jwtHandler = new JWTSecurityTokenHandler(); 

// Create a simple JWT claim set 
IList<Claim> payloadClaims = new List<Claim>() { new Claim("clm1", "clm1 value"), }; 

// Create a JWT with signing credentials and lifetime of 12 hours 
JWTSecurityToken jwt = 
    new JWTSecurityToken(jwtIssuer, jwtAudience, payloadClaims, sc, DateTime.UtcNow, DateTime.UtcNow.AddHours(12.0)); 

// Serialize the JWT 
// This is how our JWT looks on the wire: <Base64UrlEncoded header>.<Base64UrlEncoded body>.<signature> 
string jwtOnTheWire = jwtHandler.WriteToken(jwt); 

// Validate the token signature (we provide the shared symmetric key in `validationParams`) 
// This will throw if the signature does not validate 
jwtHandler.ValidateToken(jwtOnTheWire, validationParams); 

// Parse JWT from the Base64UrlEncoded wire form (<Base64UrlEncoded header>.<Base64UrlEncoded body>.<signature>) 
JWTSecurityToken parsedJwt = jwtHandler.ReadToken(jwtOnTheWire) as JWTSecurityToken; 
+0

Parece que no puedo encontrar ninguna habilidad para usar una clave simétrica, con esa. :-(tipo de pegado –

+1

No estoy seguro de entender qué quiere decir, pero, por si acaso, he actualizado mi respuesta anterior para mostrar un pedazo de código que crea, signos, serializa un JWT y luego se realiza el proceso inverso. – Kastorskij

+0

Sí Perfecto, justo lo que necesitaba. ¡Gracias! –