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;
}
}
}