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.

HubCallerContext Objeto Usuario vacío

Soy un traductor de español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código y la salida en formato markdown.

Soy principiante con SignalR Hub y tengo este problema.

Cuando se llama a “OnConnectedAsync”, el objeto Context.User siempre está vacío.

Este es el método:

csharp
[Authorize]
public override async Task OnConnectedAsync()
{
if(Context.User.Identity.IsAuthenticated)
{
await base.OnConnectedAsync();
Error er = _g.AggiungiConnessione(Context.User.Identity.Name, Context);
}
}

La autenticación está configurada de la siguiente manera:

“`csharp
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var path = context.HttpContext.Request.Path;

<pre><code> if (!path.StartsWithSegments("/chatHub"))
return Task.CompletedTask;

var accessToken = context.Request.Headers[HeaderNames.Authorization];
if (!string.IsNullOrWhiteSpace(accessToken) && context.Scheme.Name ==
JwtBearerDefaults.AuthenticationScheme)
{
context.Token = accessToken;
}

return Task.CompletedTask;
}
};
</code></pre>

});
“`

La HubConnection se declara de la siguiente manera:

csharp
if (user.Identity.IsAuthenticated)
{
hubConnection = new
HubConnectionBuilder().WithAutomaticReconnect().WithUrl(navmanager.ToAbsoluteUri("/chatHub"),
(opts) =>
{
opts.HttpMessageHandlerFactory = (message) =>
{
if (message is HttpClientHandler clientHandler)
{
clientHandler.ServerCertificateCustomValidationCallback += (sender,
certificate, chain, sslPolicyErrors) => { return true; };
}
return message;
};
opts.AccessTokenProvider = async () => await Task.FromResult(user.Identity.Name);
}
}

¿Algún consejo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que la configuración de autenticación no tiene las políticas de autorización. Cuando el usuario está autenticado, la identidad se almacena en el HttpContext y se puede acceder a ella a través de Context.User.Identity.Name en el hub de SignalR.

    Intenta agregar las políticas de autorización a la configuración de autenticación de esta manera:

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAuthenticatedUser", policy =>
        {
            policy.RequireAuthenticatedUser();
        });
    });
    

    Luego, en tu hub de SignalR, agrega el atributo [Authorize("RequireAuthenticatedUser")] a la clase para asegurarte de que solo los usuarios autenticados puedan acceder a ella.

    [Authorize("RequireAuthenticatedUser")]
    public class ChatHub : Hub
    {
        // métodos aquí
    }
    

    Asegúrate de agregar el nombre de la política al método AddAuthentication de esta manera:

    services.AddAuthentication("Bearer")
        .AddJwtBearer("Bearer", options =>
        {
            // opciones aquí
        });
    

    Si aún no funciona, intenta verificar el token de autenticación para asegurarte de que se esté enviando correctamente desde el cliente al servidor.

Comments are closed.