gpt4 book ai didi

SignalR 授权集线器连接

转载 作者:行者123 更新时间:2023-12-02 10:24:57 27 4
gpt4 key购买 nike

我想在用户连接到信号服务器时对其进行身份验证。客户端是javascript并且是跨域的。我尝试使用这个 example并且 AuthorizeHubMethodInitation 被调用,但 AuthorizeHubConnection 永远不会被调用。

我创建了一个新类AuthTicketAttribute,我在其中重写了两个方法,

public class AuthTicketAttribute : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
return base.AuthorizeHubConnection(hubDescriptor, request);
}

public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
{
return base.AuthorizeHubMethodInvocation(hubIncomingInvokerContext, appliesToMethod);
}
}

然后我将其添加到信号器映射函数中

var authorizer = new AuthTicketAttribute();
var module = new AuthorizeModule(authorizer, authorizer);

然后我尝试调试代码,当我调用方法时仅调用 AuthorizeHubMethodInitation ,当我连接时不会调用 AuthorizeHubConnection 。有什么想法吗?

然后我也许可以将环境中设置server.User的代码从AuthorizeHubConnection移动到AuthorizeHubMethodInvocau

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
{
IList<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, "The users username")
};
ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "Basic", ClaimTypes.NameIdentifier, ClaimTypes.Role);

var environment = hubIncomingInvokerContext.Hub.Context.Request.Environment;
environment["server.User"] = new ClaimsPrincipal(claimsIdentity);

hubIncomingInvokerContext.Hub.Context = new HubCallerContext(new ServerRequest(environment), hubIncomingInvokerContext.Hub.Context.ConnectionId);

return true;
}

但是当我在环境对象上设置server.User时,我得到一个NullReferenceException,但没有一个对象为空。

   at System.Web.HttpContext.SetPrincipalNoDemand(IPrincipal principal, Boolean needToSetNativePrincipal)
at System.Web.HttpContext.set_User(IPrincipal value)
at Microsoft.Owin.Host.SystemWeb.OwinCallContext.Microsoft.Owin.Host.SystemWeb.CallEnvironment.AspNetDictionary.IPropertySource.SetServerUser(IPrincipal value)
at Microsoft.Owin.Host.SystemWeb.CallEnvironment.AspNetDictionary.set_ServerUser(IPrincipal value)
at Microsoft.Owin.Host.SystemWeb.CallEnvironment.AspNetDictionary.PropertiesTrySetValue(String key, Object value)
at Microsoft.Owin.Host.SystemWeb.CallEnvironment.AspNetDictionary.System.Collections.Generic.IDictionary<System.String,System.Object>.set_Item(String key, Object value)
at LifeCommunicationServer.AuthTicketAttribute.AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, Boolean appliesToMethod) in c:\Projects\TeamFoundation\LifeManager\CareManager-Master\LifeCommunicationServer\LifeCommunicationServer\AuthTicketAttribute.cs:line 62
at Microsoft.AspNet.SignalR.Hubs.AuthorizeModule.<>c__DisplayClass2b.<BuildIncoming>b__26(IHubIncomingInvokerContext context)
at Microsoft.AspNet.SignalR.Hubs.HubPipelineModule.<>c__DisplayClass1.<<BuildIncoming>b__0>d__3.MoveNext()

最佳答案

我弄清楚了为什么没有调用 AuthorizeHubConnection。

在开始连接之前,我没有从中心订阅任何内容。

$.connection.myHub.client.something = function() {

};

$.connection.hub.start().done(function() {
alert('I'm connected!');
});

一旦我这样做了,它就会被调用。

关于SignalR 授权集线器连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275341/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com