我有一个 WCF 服务,我使用自定义 UserNamePasswordValidator 来验证用户。
public override void Validate(string userName, string password)
{
LoginHelper loginHelper = new LoginHelper();
loginHelper.ValidateUserRegularLogin(userName, password);
}
完成此操作后,将触发 IAuthorizationPolicy.Evaluate,这是我将主体设置为自定义用户上下文的地方,如下所示:
evaluationContext.Properties["Principal"] = userContext;
问题是我需要两件事来获得正确的用户上下文,这是用户名和标题中的值。
我知道我可以使用 messageinspector 来获取这样的标头数据:
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
IntegrationHeader integrationHeader;
LoginHandler loginHandler;
UserContextOnService userContext = null;
if (request.Headers.Action == null || request.Headers.Action.ToString().Length < 1)
return null;
foreach (var header in request.Headers)
{
if (header.Namespace == "ns" && header.Name == "SecurityToken")
{
return null;
}
}
throw new SecurityTokenException("Unknown username or invalid password");
}
但我需要在 Evaluate 方法中获取此信息,以便进行正确的登录(设置主体)。是否可以?如果是这样,怎么办?什么是替代方案?
PS。这将通过调用完成,因此无法使用特定的登录方法。
解决了:
我最终得到了这个:
integrationHeader = OperationContext.Current.IncomingMessageHeaders.GetHeader<IntegrationCertificateHeader>(header.Name, header.Namespace);