gpt4 book ai didi

c# - 如何创建基于 HTTP header 的自定义身份验证机制?

转载 作者:可可西里 更新时间:2023-11-01 08:44:51 24 4
gpt4 key购买 nike

我将旧版本的问题留在底部。

我想为 SignalR 客户端实现自定义身份验证。在我的例子中,这是 java 客户端 (Android)。不是网络浏览器。没有 Forms 身份验证,也没有 Windows 身份验证。这些是使用 java 库的普通 vanilla http 客户端。

所以,假设客户端在连接到 HUB 时传递自定义 header 。我需要以某种方式基于此 header 对用户进行身份验证。文档 here提到这是可能的,但没有提供有关如何实现它的任何细节。

这是我在 Android 端的代码:

hubConnection = new HubConnection("http://192.168.1.116/dbg", "", true, new NullLogger());
hubConnection.getHeaders().put("SRUserId", userId);
hubConnection.getHeaders().put("Authorization", userId);

final HubProxy hubProxy = hubConnection.createHubProxy("SignalRHub");
hubProxy.subscribe(this);


// Work with long polling connections only. Don't deal with server sockets and we
// don't have WebSockets installed
SignalRFuture<Void> awaitConnection = hubConnection.start(new LongPollingTransport(new NullLogger()));
try
{
awaitConnection.get();

Log.d(LOG_TAG, "------ CONNECTED to SignalR -- " + hubConnection.getConnectionId());
}
catch (Exception e)
{
LogData.e(LOG_TAG, e, LogData.Priority.High);
}

附言下面的原始问题是我希望“简化”问题。因为我可以在 OnConnected 回调中访问 header 。我认为有一种简单的方法可以在那里断开连接..


将 Signal R 与自定义身份验证机制结合使用。我只是检查连接客户端是否具有随连接请求传入的特定 header 。

问题是 - 我如何拒绝或不连接未通过检查的用户?文档 here并没有真正解释这种情况。提到使用证书/ header - 但没有关于如何在服务器上处理它的示例。我不使用表单或 Windows 身份验证。我的用户 - android java 设备。

这是我想拒绝连接的集线器中的代码。

public class SignalRHub : Hub
{
private const string UserIdHeader = "SRUserId";

private readonly static SignalRInMemoryUserMapping Connections = new SignalRInMemoryUserMapping();

public override Task OnConnected()
{
if (string.IsNullOrEmpty(Context.Headers[UserIdHeader]))
{
// TODO: Somehow make sure SignalR DOES NOT connect this user!
return Task.FromResult(0);
}

Connections.Add(Context.Headers[UserIdHeader], Context.ConnectionId);
Debug.WriteLine("Client {0}-{1} - {2}", Context.Headers[UserIdHeader], Context.ConnectionId, "CONNECTED");

return base.OnConnected();
}

最佳答案

所以我刚刚创建了一个自定义授权属性并覆盖了 AuthorizeHubConnection 方法以访问请求并实现了您尝试对 header 执行的逻辑,它似乎正在工作。

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignalR.Web.Authorization
{
public class HeadersAuthAttribute : AuthorizeAttribute
{
private const string UserIdHeader = "SRUserId";

public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
if (string.IsNullOrEmpty(request.Headers[UserIdHeader]))
{
return false;
}

return true;
}
}
}

中心

 [HeadersAuth]
[HubName("messagingHub")]
public class MessagingHub : Hub
{

}

这会在控制台中产生此结果(如果图片未显示,则为 [加载资源失败:服务器响应状态为 401(未授权)]):

enter image description here

关于c# - 如何创建基于 HTTP header 的自定义身份验证机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38663924/

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