SignalR Context.User.Identity.Name является нулем в клиенте / сервере консоли

Я просмотрел почти все сообщения по этой проблеме 2 раза, чтобы убедиться, что я ничего не пропустил. Я все еще не заставляю это работать хотя.

У меня есть консоль SignalR Hub с помощью Microsoft.AspNet.SignalR.Core У меня есть консольный клиент SignalR, подключающийся к серверу, и мне нужно отправить несколько сообщений. Когда я подключаюсь к серверу с GlobalHost.HubPipeline.RequireAuthentication(); в конфигурации сервера я получаю 401: Несанкционированная ошибка обратно. Если я возьму это, это работает, но Context.User.Identity.Name пуст в OnConnect,

Есть ли еще что-то, что я пропустил?

Вот мой код: Hub

namespace SignalRService
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "http://*:8081";
            using (WebApp.Start(url))
            {
                Console.WriteLine("Server running on {0}", url);
                Console.ReadLine();
            }
        }
    }

    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
            GlobalHost.HubPipeline.RequireAuthentication();
        }
    }

    public class MyHub : Hub
    {
        public ConnectionMapping<string> connections = new ConnectionMapping<string>();
        public override Task OnConnected()
        {
            connections.Add(Context.User.Identity.Name, Context.ConnectionId);
            return Clients.All.joined(GetAuthInfo());
            //return base.OnConnected();
        }
        protected object GetAuthInfo()
        {
            var user = Context.User;
            return new
            {
                IsAuthenticated = user.Identity.IsAuthenticated,
                IsAdmin = user.IsInRole("Admin"),
                UserName = user.Identity.Name
            };
        }

        public void SendToUser(string UserName, string name, string Message)
        {
            //Clients.User(UserName).send(name, Message);
        }

        public void Send(string name, string message)
        {
            Clients.All.addMessage(name, message);
        }
    }
}

Клиент, использующий Microsoft.AspNet.SignalR.Client

namespace ConsoleApp5
{
    class Program
    {
        private static void Main(string[] args)
        {
            //Set connection
            var connection = new HubConnection("http://127.0.0.1:8081/");
            //Make proxy to hub based on hub name on server
            connection.Credentials = CredentialCache.DefaultCredentials;

            var myHub = connection.CreateHubProxy("MyHub");
            //Start connection

            //myHub.On<>
            myHub.On<string, string>("addMessage", (param1, param2) =>
            {
                Console.WriteLine($"{param1}:  {param2}");
            });

            connection.Start().ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    Console.WriteLine("There was an error opening the connection:{0}",
                                      task.Exception.GetBaseException());
                }
                else
                {
                    Console.WriteLine("Connected");
                }

            }).Wait();



            myHub.Invoke<string>("Send", "Peter Pan", "HELLO World ").ContinueWith(task => {
                if (task.IsFaulted)
                {
                    Console.WriteLine("There was an error calling send: {0}",
                                      task.Exception.GetBaseException());
                }
                else
                {
                    Console.WriteLine(task.Result);
                }
            });

            Console.Read();
            connection.Stop();
        }
    }
}

Я добавил это на сервере, но это не помогло

    [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
    public class AuthorizeClaimsAttribute : AuthorizeAttribute
    {
        protected override bool UserAuthorized(System.Security.Principal.IPrincipal user)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }

            var principal = (ClaimsPrincipal)user;

            if (principal != null)
            {
                Claim authenticated = principal.FindFirst(ClaimTypes.Authentication);
                return authenticated.Value == "true" ? true : false;
            }
            else
            {
                return false;
            }
        }
    }

0 ответов

Другие вопросы по тегам