您好,
我已将WCF设置为web服务(percall),此Web服务将从各种系统获取请求。现在我们需要一些方法来识别客户端。
可以构建CustomUserNamePasswordValidation,但这需要安全(SLL)通信。在我们的例子中,我们不需要安全性,解决方案需要尽可能简单地设置。
所以问题是如何在每次通话时发送客户端标识(用户名/密码)?
我可以将标识数据放在header中,但我不确定如何使用示例soupUI来测试它?我不确定所有能够进行通信的系统是否可以在没有复杂情况的情况下处理这个问题?
任何sugestions?
请注意:我只想进行1次通话,因此不需要使用登录服务方法。
答案 0 :(得分:1)
WCF不支持发送不安全的用户凭据。要解决此问题,您可以使用the clear username binding或在邮件标题中手动添加凭据(这对于WCF来说很简单)
答案 1 :(得分:0)
在web.config中定义绑定,如:
<basicHttpBinding>
<binding name="BasicAuthBinding">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</basicHttpBinding>
然后定义服务行为,如:
<behavior name="Namespace.TestBehaviour">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="Namespace.ServiceSecurity.UserAuthenticator, Namespace" />
</serviceCredentials>
<serviceAuthorization>
<authorizationPolicies>
<add policyType="Namespace.ServiceSecurity.MyAuthorizationPolicy, Namespace" />
</authorizationPolicies>
</serviceAuthorization>
</behavior>
然后提供自定义身份验证和授权类,如下所示:
public class MyAuthorizationPolicy: IAuthorizationPolicy
{
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
IList<IIdentity> identities = (IList<IIdentity>) evaluationContext.Properties["Identities"];
foreach (IIdentity identity in identities)
{
if (identity.IsAuthenticated &&
identity.AuthenticationType == "UserAuthenticator")
{
evaluationContext.Properties["Principal"] = identity.Name;
return true;
}
}
if (!evaluationContext.Properties.ContainsKey("Principal"))
{
evaluationContext.Properties["Principal"] = "";
}
return false;
}
public ClaimSet Issuer
{
get { throw new NotImplementedException(); }
}
}
身份验证如下:
public class UserAuthenticator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
//authenticate me however you want
//then set whatever you want
}
}
如果您需要进一步的安全性,请将basicHttpBinding更改为wsHttpBinding并使用证书
编辑:几乎忘了,在web.config中的服务接口定义中使用已定义的服务行为和绑定。
答案 2 :(得分:0)
在代码中:
public class WCF_Project_Authentification : UserNamePasswordValidator
{
#region UserNamePasswordValidator Interface Member
public override void Validate(string userName, string password)
{
if (userName != "Jeanc" || password != "fortin")
{
throw new FaultException("Authentification failed");
}
}
#endregion
}
在配置中:
<behaviors>
<serviceBehaviors>
<behavior name="Service_Behavior">
<serviceMetadata httpGetEnabled="False" httpsGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="WcfService.Authentification.WCF_Project_Authentification, WcfService"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
在客户端代码中:
proxy.ClientCredentials.UserName.UserName = "Jeanc";
proxy.ClientCredentials.UserName.Password = "fortin";