web-dev-qa-db-fra.com

SignalR dans ASP.Net Core 401 non autorisé

J'ai un petit problème avec mon application UWP. Tout d'abord, l'application UWP possède les fonctionnalités suivantes:

  • Authentification d'entreprise
  • Certificats d'utilisateurs partagés
  • Réseaux privés
  • Informations sur le compte d'utilisateur

Je souhaite maintenant me connecter à un SignalR-Hub dans une API Web ASP.NET Core 2.1. Le hub ressemble à ceci:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;

namespace Test.Namespace
{
    [Authorize]
    public class SyncHub : Hub
    {
        public void SendUpdate()
        {
            Clients.All.SendAsync("Update");
        }
    }
}

Et voici mon Startup.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace Test.Namespace
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddSignalR();
            services.AddSingleton<IUserIdProvider, NameUserIdProvider>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseHttpsRedirection();

            app.UseSignalR(routes =>
            {
                routes.MapHub<SyncHub>("/syncHub");
            });
            app.UseMvc();
        }
    }
}

L’ensemble de l’API s’exécute sur un IIS avec l’authentification Windows configurée. Active Directory s'exécute sur le même ordinateur.

Et voici comment mon application UWP appelle le service:

            HubConnection connection = new HubConnectionBuilder().WithUrl("http://Server:81/syncHub", options => {
                options.UseDefaultCredentials = true;
            }).Build();
            await connection.StartAsync();

Cet appel lance toujours un 401.

Qu'est-ce que je fais mal? Je travaille sur ce problème depuis plus d'une semaine maintenant et je ne comprends pas pourquoi il ne fonctionne pas.

Merci à tous ceux qui vont m'aider :)

Edit : J'ai donc essayé quelques réflexions aujourd'hui et découvert que ce n'était pas un problème de SignalR lui-même. J'ai créé une application pour console ASP.NET Core avec exactement le même appel et tout fonctionne correctement. Cela fonctionne également lorsque je code les informations d'identification dans l'application UWP. Cela ne fonctionne pas uniquement lorsque j'utilise "UseDefaultCredentials" dans UWP. Je suis complètement désemparé. J'ai revérifié les capacités mais cela n'aide pas non plus.

4
HardSoul

Finalement!

La réponse était vraiment difficile à trouver, mais maintenant cela fonctionne! Selon ce site: https://support.Microsoft.com/en-us/help/303650/intranet-site-is-identified- as-un-site-internet-quand-vous-utilisez-un-fqdn-o

l'application identifie l'appel comme un appel à Internet et n'autorise donc pas l'envoi des informations d'identification par défaut. Je dois ajouter cette page manuellement aux sites Intranet locaux avec Internet Explorer et cela a fonctionné comme un charme.

Merci à tous ceux qui m'ont aidé avec ça :)

0
HardSoul

Il semble que app.UseHttpsRedirection(); ne parvienne pas à rediriger les informations d'identification du client. 

Essayez de faire un test avec https url. 

var hubConnectionBuilder = new HubConnectionBuilder();
var hubConnection = hubConnectionBuilder.WithUrl("https://localhost:44381/timeHub",options => {
    options.UseDefaultCredentials = true;
}).Build();
await hubConnection.StartAsync();
0
Tao Zhou