У меня есть служба WCF 4.0 REST на стороне сервера (размещенная в IIS) и клиент Android.Клиент Android отправляет зашифрованный маркер безопасности в настраиваемом заголовке HTTP для аутентификации пользователя.Я реализовал пользовательский ServiceAuthorizationManager
, который извлекает токен безопасности из заголовка.Токен содержит имя пользователя, которое я могу прочитать из токена:
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;
}
}
Теперь моя проблема заключается в том, что мне также необходимо имя аутентифицированного пользователя в различных операциях службы (главным образом для доступа к данным профиля пользователя) иЯ планировал получить его таким образом:
public void MyServiceOperation()
{
string userName = OperationContext.Current
.ServiceSecurityContext.PrimaryIdentity.Name;
// check profile store for that userName and do something depending on
// profile settings
}
Как я могу установить это имя пользователя в CheckAccessCore
?
Очень наивное испытание, подобное этому ...
operationContext.ServiceSecurityContext.PrimaryIdentity.Name = userName;
... не работает, потому что PrimaryIdentity.Name
только для чтения.Я предполагаю, что требуется более сложный код.