J'ai un service REST WCF 4.0 côté serveur (hébergé dans IIS) et un client Android. Le client Android envoie un jeton de sécurité crypté dans un en-tête HTTP personnalisé afin d'authentifier l'utilisateur. J'ai implémenté une fonction personnalisée ServiceAuthorizationManager
qui extrait le jeton de sécurité de l'en-tête. Le jeton contient le nom d'utilisateur que je peux lire à partir du jeton :
public class MyAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
var requestMessage = operationContext.RequestContext.RequestMessage;
var requestProperty = (HttpRequestMessageProperty)requestMessage
.Properties[HttpRequestMessageProperty.Name];
var token = requestProperty.Headers["X-MyCustomHeader"];
if (!string.IsNullOrEmpty(token))
{
var userName = GetUserNameFromToken(token);
if (!string.IsNullOrEmpty(userName))
{
// How to save userName now so that I can
// retrieve it in the service operations?
return true;
}
}
return false;
}
}
Mon problème est que j'ai également besoin du nom de l'utilisateur authentifié dans diverses opérations de service (principalement pour accéder aux données du profil de l'utilisateur) et j'avais prévu de le récupérer de cette manière :
public void MyServiceOperation()
{
string userName = OperationContext.Current
.ServiceSecurityContext.PrimaryIdentity.Name;
// check profile store for that userName and do something depending on
// profile settings
}
Comment puis-je définir ce nom d'utilisateur dans CheckAccessCore
?
Un procès très naïf comme celui-ci...
operationContext.ServiceSecurityContext.PrimaryIdentity.Name = userName;
...ne fonctionne pas parce que PrimaryIdentity.Name
est en lecture seule. Je suppose qu'un code plus sophistiqué est nécessaire.