如何使用 DI 向 WCF Web 服务添加自定义授权
How do I add custom authorisation to WCF web service using DI
我正在使用 .NET 4.5 和 SimpleInjector 编写 WCF 服务。它是一个 REST 服务(使用 http/get/post)。
我需要为我的服务添加授权层。经过一番折腾,我现在有了一个基于 ServiceAuthorizationManager 的自定义授权管理器。
我见过的所有示例(我发现了很多)都对用户名和密码检查进行了硬编码。我想使用数据库,因此想将数据层注入我的 class。如果我更改构造函数以获取参数,它会抛出异常 "No parameterless constructor defined for this object".
这是我基于代码的示例: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?
您可能所做的是在配置文件的行为中配置您的管理器 class(如 MSDN 文章所示):
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager,MyAssembly" />
</behavior>
</serviceBehaviors>
在那种情况下,WCF 完全控制了该类型的创建;不是简单的注射器。这意味着它需要一个默认构造函数。
想到的第一个解决方案是使 class 成为 Humble Object 并让它委托给您放入真实服务中的真实身份验证逻辑。这基本上意味着您的 Humble Object 只是调用容器来解析真正的服务并调用其适当的方法。解析应在 Humble Object 的 class 内完成,不应缓存 'real' 服务。
另一种选择是通过从容器中解析它并将其分配给 WCF 来从代码配置您的管理器(如 MSDN 也显示的那样):
serviceHost.Authorization.ServiceAuthorizationManager =
container.GetInstance<MyServiceAuthorizationManager>();
但这里必须小心,因为管理器现在变成了单例,因为 WCF 将永远保留它。不要这样做,除非它的所有依赖项也是单例的。确保您在容器中将您的管理器显式注册为单例,以便容器可以在您调用 Verify
.
时为您检查俘虏依赖项
我正在使用 .NET 4.5 和 SimpleInjector 编写 WCF 服务。它是一个 REST 服务(使用 http/get/post)。
我需要为我的服务添加授权层。经过一番折腾,我现在有了一个基于 ServiceAuthorizationManager 的自定义授权管理器。
我见过的所有示例(我发现了很多)都对用户名和密码检查进行了硬编码。我想使用数据库,因此想将数据层注入我的 class。如果我更改构造函数以获取参数,它会抛出异常 "No parameterless constructor defined for this object".
这是我基于代码的示例: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?
您可能所做的是在配置文件的行为中配置您的管理器 class(如 MSDN 文章所示):
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager,MyAssembly" />
</behavior>
</serviceBehaviors>
在那种情况下,WCF 完全控制了该类型的创建;不是简单的注射器。这意味着它需要一个默认构造函数。
想到的第一个解决方案是使 class 成为 Humble Object 并让它委托给您放入真实服务中的真实身份验证逻辑。这基本上意味着您的 Humble Object 只是调用容器来解析真正的服务并调用其适当的方法。解析应在 Humble Object 的 class 内完成,不应缓存 'real' 服务。
另一种选择是通过从容器中解析它并将其分配给 WCF 来从代码配置您的管理器(如 MSDN 也显示的那样):
serviceHost.Authorization.ServiceAuthorizationManager =
container.GetInstance<MyServiceAuthorizationManager>();
但这里必须小心,因为管理器现在变成了单例,因为 WCF 将永远保留它。不要这样做,除非它的所有依赖项也是单例的。确保您在容器中将您的管理器显式注册为单例,以便容器可以在您调用 Verify
.