gpt4 book ai didi

signalr - 在从 Web 访问的自托管 SignalR 服务器中实现授权

转载 作者:行者123 更新时间:2023-12-04 15:12:56 25 4
gpt4 key购买 nike

我正在寻找有关如何在自托管(非 IIS)环境中运行的后端服务上实现 SignalR 授权安全的一些指导,该环境是从 Web 应用程序调用的。后端应用程序基本上是一个将 SignalR 事件触发回基于 HTML 的客户端的监视器。这一切都很好(实际上非​​常好)。

但是,我们需要限制来自 Web 站点的经过身份验证的用户对服务器的访问。所以基本上如果一个用户在网站上通过了身份验证,我们需要以某种方式在后端应用程序中获取凭据(用户名就足够了)和验证状态来决定是否允许连接以避免未经授权的访问。

任何人都可以指出一些关于如何完成这种身份验证转发的策略或模式吗?

最佳答案

我在这里遇到了类似的问题,因为在我的网络应用程序中,我使用了一个简单的 cookie 身份验证系统,它使用 AoP 样式方法来检查任何具有属性的 Controller ,然后将获取当前上下文(无论是来自静态 HttpContext.Current 还是根据拦截器的类型从目标调用对象),然后验证 cookie 是否存在,它包含正确的数据,然后最后用数据库或缓存等验证 token 。

无论如何,这种方法也可以用于 Signalr,尽管它有点冗长并且您正在使用依赖注入(inject)。您基本上将使用所需属性包装集线器调用,然后设置您的 DI/IoC 配置以拦截这些调用,然后在拦截器中获取集线器实例并从请求中获取 cookie(或您的自定义身份验证机制),验证是否全部有效,如果无效则抛出 new HttpException("403", "Not authenticated");它应该在用户到达你的集线器方法之前将用户踢出去并返回,这样你就可以将逻辑放在一个地方(你的拦截器或拦截器使用的类),然后只需包装任何需要使用此身份验证的方法你的属性。

我使用 Ninject 和拦截扩展,但现在大多数主要的 DI 框架都有某种形式的 IoC 插件/扩展,例如 Autofac、Windsor、Spring 等。

如果您不喜欢将 DI 和/或 AOP 引入当前项目的路线,那么也许您可以创建一个包含身份验证逻辑的自定义集线器实例,然后在集线器中使用它,所以好吧,您仍然会从要保护的每个集线器方法中手动调用一些身份验证逻辑,但代码较少,例如:

public class AuthorisableHub : Hub
{
private ISomeAuthenticationToken GetSomeAuthenticationTokenFromRequest(Request request) // probably a SignalR specific request object
{
// Get your token from the querystring or cookie etc
}

private bool IsAuthenticationTokenValid(ISomeAuthenticationToken token)
{
// Perform some validation, be it simple or db based and return result
}

protected void PerformUserAuthentication()
{
var token = GetSomeAuthenticationTokenFromRequest(Context.Request);
var isRequestValid = IsAuthenticationTokenValid(token);

if(!isRequestValid)
{ throw new HttpException(403, "<Some forbidden message here>"); }
}
}

public class MyFancyPantsHub : AuthorisableHub
{
public void TellAllClientsSomethingSecret(ISecret secret)
{
PerformUserAuthentication();

// Do stuff with the secret as it should have bombed the user out
// before it reaches here if working correctly
}
}

它并不完美,但会起作用(我认为),而且我确信我曾经在某处读到过为每个请求新实例化集线器,如果这确实是真的,如果你想的话,你可以把这个逻辑放在你的构造函数中将身份验证应用于集线器内的每个操作。

希望对您有所帮助,或给您一些想法……有兴趣知道您最终是如何解决它的。

关于signalr - 在从 Web 访问的自托管 SignalR 服务器中实现授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15843849/

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