Ho un servizio WCF in cui utilizzo un UserNamePasswordValidator personalizzato per convalidare l'utente.Login con IAuthorizationPolicy e UserNamePasswordValidator con dati di intestazione?
public override void Validate(string userName, string password)
{
LoginHelper loginHelper = new LoginHelper();
loginHelper.ValidateUserRegularLogin(userName, password);
}
Quando questo è fatto l'IAuthorizationPolicy.Evaluate viene attivato e questo è dove ho impostato il preside ad un contesto utente personalizzato come questo:
evaluationContext.Properties["Principal"] = userContext;
Il problema è che ho bisogno di 2 cose per ottenere il corretto usercontext e questo è username e un valore dall'intestazione.
So che posso usare un messageinspector per ottenere i dati di intestazione come questo:
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");
}
Ma ho bisogno di ottenere queste informazioni nel metodo Valutare in modo da poter fare un login corretto (set principale). È possibile? E se sì, come? Qual è l'alternativa?
PS. Ciò avverrà tramite chiamata in modo che non possa essere utilizzato alcun metodo di accesso specifico.
risolto:
ho finito con questo:
integrationHeader = OperationContext.Current.IncomingMessageHeaders.GetHeader<IntegrationCertificateHeader>(header.Name, header.Namespace);
Un trucco sporco che posso pensare è in AfterReceiveRequest di estrarre i valori da intestazione e impostarlo su claimset di identità e poi in Valutare estrarlo dalla claimset di identità e di utilizzarlo nel modo desiderato. Non l'ho provato ma immagino che dovrebbe funzionare. –