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?
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:
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.Asegúrate de agregar el nombre de la política al método
AddAuthentication
de esta manera: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.