【问题标题】:How do I add custom authorisation to WCF web service using DI如何使用 DI 向 WCF Web 服务添加自定义授权
【发布时间】:2016-03-21 15:48:41
【问题描述】:

我正在使用 .NET 4.5 和 SimpleInjector 编写 WCF 服务。它是一个 REST 服务(使用 http/get/post)。

我需要为我的服务添加一个授权层。经过一番折腾,我现在有了一个基于 ServiceAuthorizationManager 的自定义授权管理器。

我见过的所有例子(我发现很多)都有硬编码的用户名和密码检查。我想使用数据库,因此想将数据层注入我的班级。如果我将构造函数更改为带参数,则会引发异常“没有为此对象定义无参数构造函数”。

这是我基于代码的示例:https://msdn.microsoft.com/en-us/library/ms731774(v=vs.110).aspx 我添加了一个带有接口的构造函数:

public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
    public MyServiceAuthorizationManager (IMyDataLayer mdl)
    { ...

Custom "Basic" Authentication for my WCF services. REST and RIA. Possible?

【问题讨论】:

  • 请您包括引发错误的代码和完整的堆栈跟踪吗?
  • 这是一个使用 WCF 的 REST 服务?你确定要这样做吗? WCF 有点烂,如果你做 REST,Web API 会让这更容易。我认为如果您使用 Web API 应用 this practice,您的生活会变得更轻松,如 this repository 所示。
  • @Steven 这正是我正在做的事情。

标签: c# wcf authentication dependency-injection simple-injector


【解决方案1】:

您可能所做的是在配置文件的行为中配置您的管理器类(如 MSDN 文章所示):

<serviceBehaviors>
  <behavior name="CalculatorServiceBehavior">
    <serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager,MyAssembly" />
  </behavior>
</serviceBehaviors>

在这种情况下,WCF 完全控制该类型的创建;不是简单的注射器。这意味着它需要一个默认构造函数。

想到的第一个解决方案是将该类设为Humble Object,并让它委托给您放入真实服务的真实身份验证逻辑。这基本上意味着您的 Humble Object 无非就是调用容器来解析真正的服务并调用其适当的方法。解析应在 Humble Object 的类中完成,不应缓存“真实”服务。

另一种选择是通过从容器中解析它并将其分配给 WCF 从代码(如 MSDN 也显示)配置您的管理器:

serviceHost.Authorization.ServiceAuthorizationManager =
    container.GetInstance<MyServiceAuthorizationManager>();

但这里必须小心,因为经理现在变成了单身人士,因为 WCF 将永远保留它。除非它的所有依赖项都是单例的,否则不要这样做。确保您在容器中将您的管理器显式注册为单例,以便在您调用 Verify 时,容器可以为您检查强制依赖项。

【讨论】:

  • 如你所说,我使用了配置文件版本,最终也得到了 serviceHost.Authorisation。我担心基本上是单身人士处理所有授权。我将调查 Humble 对象(不是我以前遇到过的模式。谢谢。
  • 我接受了你的回答,因为它基本上证实了我的怀疑并提供了合适的解决方法。
猜你喜欢
  • 2013-03-17
  • 2012-01-28
  • 2015-01-30
  • 2020-12-06
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多