如何从客户端调用signalR服务器方法中的authorize方法?

时间:2015-08-04 04:33:07

标签: c# security client server signalr

我正在学习c#中的signalR安全性。对于signalR,谷歌提供的样本和文档很多。使用这个我可以理解signalR的概念。我正在尝试使用授权创建控制台聊天应用程序。没有authorize属性,我可以发送和接收消息。使用“[authorize]”时,我收到以下错误。

Error: InnerException: System.InvalidOperationException
HResult=-2146233079
Message=There was an error invoking Hub method 'Test.DetermineLength'.

enter image description here

服务器程序:

public class Program
{
    static void Main(string[] args)
    {
        string url = @"http://localhost:8080/";
        using (WebApp.Start<StartUp>(url))
        {
            Console.WriteLine(string.Format("Server running at {0}", url));
            Console.ReadLine();
        }
    }
    public class StartUp
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }
    [HubName("Test")]
    public class TestHub : Hub
    {
        [Authorize]
        public void DetermineLength(string message)
        {                
            Console.WriteLine(message);
            string newMessage = string.Format(@"{0} has a length of: {1}", message, message.Length);
            Clients.All.ReceiveLength(newMessage);
        }
    }
}

客户计划:

public class Program
{
    static void Main(string[] args)
    {
        IHubProxy _hub;
        string url = @"http://localhost:8080/";
        var connection = new HubConnection(url);
        _hub = connection.CreateHubProxy("Test");
        connection.Start().Wait();
        string line = null;
        while ((line = System.Console.ReadLine()) != null)
        {
            _hub.Invoke("DetermineLength", line).Wait();
            _hub.On("ReceiveLength", x => Console.WriteLine(x));
        }
     }
}

如何在c#中使用siganlR在客户端和服务器之间执行授权通信。救救我!

1 个答案:

答案 0 :(得分:0)

来自SignalR官方文档:

  

SignalR提供Authorize属性以指定哪些用户或角色可以访问集线器或方法。此属性位于Microsoft.AspNet.SignalR命名空间中。您将“授权”属性应用于集线器或集线器中的特定方法。将Authorize属性应用于集线器类时,指定的授权要求将应用于集线器中的所有方法。本主题提供了可以应用的不同类型的授权要求的示例。如果没有Authorize属性,连接的客户端可以访问集线器上的任何公共方法。

http://www.asp.net/signalr/overview/security/hub-authorization

您想为谁授权该方法?你有用户定义的角色吗? 您无法将此方法与ListNode*& head属性一起使用,因为您的应用中没有任何用户。

尝试定义一些角色并查看它是否有效。

祝你好运!