我正在开发一个 webservice ,它必须符合给定应用程序所需的WSDL规范,并且每个SOAP请求都带有用户名和密码< / em>用清晰的纯文本(我知道这是一个非常糟糕的主意,但这不是我的设计选择)。现在,我必须通过针对有效凭据的数据库检查这些凭证来验证对我的服务方法的每次调用。我听说过WCF的UserNamePasswordValidator
但是,根据我的理解,这仅适用于凭证通过SOAP标头传递的情况,而不是。我有什么选择?
答案 0 :(得分:1)
你知道这是一个坏主意,所以我不会质疑你的设置: - )
如果您的用户名和密码通过soap体内的电线以明文形式发送,只需使用信息手动验证您的数据库实例。获取用户名和密码并使用SQL查询验证(或其MD5哈希值),仅在数据库中找到值时返回一行。当该行返回时,您知道用户已通过身份验证。
答案 1 :(得分:0)
我有什么选择?
在这种情况下,您需要做的是为您的服务实施自定义授权管理器。这不是很难做到,因为我之前做了好几次。简而言之,您将服务配置为指向一个名为CheckAccessCore
的新重写方法,您可以在其中执行授权逻辑。您应该能够检查上下文和消息正文以获取所需的任何凭据。要理解的一件事是 在此时检查消息体有一些性能影响,但如果你别无选择,至少一个可行的解决方案就足够了。
这一切都发生在之前到被称为执行的实际方法,这是有效的,因为如果它们未被授权,则永远不会调用该方法。
所以这里可能是一个典型的配置(为简洁起见,遗漏了一些其他配置):
<behaviors>
<serviceBehaviors>
<behavior name="MySvcBehavior">
<serviceAuthorization serviceAuthorizationManagerType="MyWCFService.CustomAuthorizationManager, MyWCFService" />
</behavior>
</serviceBehaviors>
<behaviors>
在您的服务代码中,您可能会遇到类似以下内容的问题,或者使用您自己的需要来检查邮件正文:
public class CustomAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
IIdentity primaryIdentity = operationContext.ServiceSecurityContext.PrimaryIdentity;
if (primaryIdentity.Name == "user1")
{
return true;
}
else
{
return false;
}
}
}
以下是我在MSDN中编写的代码中的一些注意事项: Windows Communication Foundation(WCF)中的身份模型基础结构支持基于声明的可扩展授权模型。声明从令牌中提取,并可选择由自定义授权策略处理,然后放入AuthorizationContext。授权管理器检查AuthorizationContext中的声明以进行授权决策。默认情况下,授权决策由ServiceAuthorizationManager类决定;但是,可以通过创建自定义授权管理器来覆盖这些决策。要创建自定义授权管理器,请创建一个派生自ServiceAuthorizationManager(此类)的类,并实现CheckAccessCore方法(在此类中完成)。授权决策在CheckAccessCore方法中进行,在授予访问权限时返回“true”,在访问被拒绝时返回“false”。
以下是(2)其他链接。第一个是使用方法中的声明的MSDN链接。请记住,您可以在CheckAccessCore
内执行任何。它只需要在结束时返回true
或false
。第二个链接是我的博客中的一个,我有一个完整的实现,但使用Windows身份验证。再一次,您的详细信息将是检查邮件正文,以便在CheckAccessCore
方法中获取所需的详细信息。
如何:为服务创建自定义授权管理器:
http://msdn.microsoft.com/en-us/library/ms731774.aspx
如何:为WCF服务创建ASP.NET样式的Windows身份验证策略:
http://allen-conway-dotnet.blogspot.com/2010/01/how-to-create-aspnet-windows.html