【问题标题】:N-Tier Application Authentication (RabbitMQ as Broker and C# as Business Tier) - WIF possible?N 层应用程序身份验证(RabbitMQ 作为代理,C# 作为业务层)- WIF 可能吗?
【发布时间】:2023-11-19 21:04:01
【问题描述】:

我目前正在开发一个使用 C# 作为业务层的 N 层应用程序。这是一种 ERP,我需要对此应用程序进行身份验证(电子邮件/密码)。 我还需要基于登录的权限(创建订单,删除文章) 所有这些信息都应该存储在一个数据库中。

作为 UI 客户端,我计划制作 WPF 客户端、ASP.Net 以及未来的 iPhone/Android。 作为消息代理,我使用 RabbitMQ(客户端仅通过 AMQP 与业务层对话。由于优势,我有多个业务层用于循环调度)。

在我对 N 层应用程序中的身份验证进行的研究中,我发现了一个针对 Windows Identity Foundation 的建议。 WIF 对我来说是全新的。我发现的所有示例都只处理 ASP.Net 应用程序。

我现在的问题是: WIF 对我来说是正确的还是我应该自己实现这个会话处理?

如果 WIF 可以满足我的需求,那么处理这个问题的最佳方法是什么? 我是否必须实现自定义 STS 并将其放置在 WCF 服务中?

【问题讨论】:

    标签: c# authentication rabbitmq wif amqp


    【解决方案1】:

    当您明确提到 RabbitMq 时,我建议使用 ServiceStack 作为您的服务接口。

    MQ 的一个一般问题是它们与任何元信息(例如 HTTP 标头)分离以注入身份验证。相反,您应该在消息中提供属性Session(带有预身份验证)或UserNamePassword(不首选后者,因为凭据以明文形式传递)。 ServiceStack 内置SessionFeature 的示例解决方案可在in their documentation 获得。

    ServiceStack 的另一个不错的特性是,您不仅可以使用AuthenticateAttribute 装饰您的处理程序,还可以使用RequiredRoleAttributeRequiredPermissionAttribute

    另外:您打算如何使用 Android 将消息排队?您能否将内部 MQ 暴露给外部,是否有可用于例如 Android 的客户端?因此,我建议使用 HTTP 上的双端点在您选择使用的任何 MQ 中对消息进行排队。有关如何在 HTTP 服务中集成 MQ 的更多信息,请访问 in the documentation

    使用 ServiceStack,您可以旋转任意数量的消费者实例,is a plain communication without all the serivce stuff available

    琐事:当我正在撰写一本即将出版的关于Mastering ServiceStack的书时,我有点偏颇。尽管如此,我确实在书中涵盖了您的大部分问题,并提供了代码示例:您的场景的点点滴滴are already covered here(不要被特定的 MQ 吓到,它们是可以互换的)。

    【讨论】:

    • 感谢您的回答。我有一个关于 ServiceStack 的问题。我阅读了 wiki 页面,但看不到是否可以将 rabbitmq 与主题一起使用。
    • @ThomasGeulen 我怀疑这是否不是 XY 问题 - 内部路由主题是可能的(因为您可以调整交换,...​​...无论如何都可以使用本机客户端),但可以在专注于解决方案之前,您请描述您试图通过主题解决的问题?这里无意冒犯,只是想了解您的实际问题给您建议。
    • @ThomasGeulen 但是是的,您可以使用例如RabbitMqExtensions.RegisterTopic(this IModel channel, string queueName) 注册到一个主题(它在内部使用本机客户端,如果您有任何花哨的队列名称,您可以直接使用...)其中queueName 是您的路由键模式和实际队列名称。唯一的问题是您无法轻松地使用.RegisterHandler<T> 在服务中为队列注册处理程序 - 因此您必须直接与本机客户端交互......无论如何,要明白这个想法:*.com/a/30830697/57508
    最近更新 更多