es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OpenId/AzureAd – valor incorrecto en HttpContext.User.Identity.Name en .net core 6

Nuestro proyecto utiliza Azure AD para autenticar a los usuarios.

Después de migrar de .net core 3 a .net core 6, empezamos a recibir dos veces el Claim con el tipo “http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”. Puedes verlo en la captura de pantalla que adjunto a continuación. Uno es esencialmente el nombre completo del usuario (John Doe) y el otro es una dirección de correo electrónico que necesitamos.

enter image description here

Esto rompe nuestro código de autenticación ahora, ya que estábamos utilizando HttpContext.User.Identity.Name para buscar al usuario en nuestra base de datos. Esa propiedad toma el valor de Name del claim mencionado anteriormente.

En .net core 3 obteníamos ambos claims, pero el nombre completo tenía un tipo simple “name” y el de la dirección de correo electrónico era “http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”. Y eso funcionaba muy bien. Ahora, al recibir el mismo tipo de claim dos veces, el primero se poblaba en Name y es el nombre completo en lugar de la dirección de correo electrónico que queremos.

Ya tengo algunas soluciones alternativas.

Una es cambiar el tipo de claim origen para la propiedad Name:
C#
options.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";

Otra solución incluye una clase sencilla que implementa la interfaz IClaimsTransformation y me permite eliminar/corregir el claim duplicado para que funcione como antes.

Pero ambas soluciones no son ideales. UPN no garantiza que sea igual que el claim /name (y tenemos muchos usuarios que se registraron usando el valor /name) y, por lo que entiendo, es posible que no esté disponible en absoluto.
Y la segunda solución no es fiable, ya que es difícil distinguir entre el nombre completo y la dirección de correo electrónico (alguien puede incluir “@” en el nombre completo del usuario o un campo con dirección puede enviarnos algo que no tiene forma de dirección de correo electrónico).

Entonces, la pregunta es: ¿qué puede estar causando este problema? ¿Qué puede controlarlo? Creo que esto tiene algo que ver con los cambios recientes en .net, ya que no hemos hecho nada en nuestra configuración de Azure AD. Y el código antiguo sigue funcionando bien con él.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema de obtener la misma reclamación con el tipo “http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name” dos veces después de migrar de .net core 3 a .net core 6 podría ser causado por cambios en cómo el controlador de JWT procesa las reclamaciones. En .net core 6, el controlador de JWT procesa las reclamaciones en un orden diferente, lo que lleva a la duplicación de las reclamaciones.

    Una posible solución a este problema es implementar un transformador personalizado de reclamaciones que elimine o corrija las reclamaciones duplicadas. Sin embargo, esta solución puede no ser confiable, ya que puede ser difícil distinguir entre el nombre completo y las reclamaciones de dirección de correo electrónico.

    Otra posible solución es cambiar el tipo de reclamación fuente para la propiedad Name. Sin embargo, esta solución no es ideal, ya que es posible que el tipo de reclamación UPN no esté disponible o no coincida con el tipo de reclamación /name.

    Para resolver este problema, puedes intentar utilizar la clase JwtSecurityTokenHandler en lugar de depender del controlador de JWT predeterminado. La clase JwtSecurityTokenHandler permite tener un mayor control sobre cómo se procesan las reclamaciones, incluida la capacidad de eliminar duplicados.

    Puedes utilizar el siguiente código para configurar el controlador de JWT para que use JwtSecurityTokenHandler:

    C#
    services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
    options.SecurityTokenValidators.Clear();
    options.SecurityTokenValidators.Add(new JwtSecurityTokenHandler());
    });

    Esto debería resolver el problema de obtener la misma reclamación con el tipo “http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name” dos veces después de migrar a .net core 6.

Comments are closed.