Я изо всех сил пытаюсь понять и настроить Сервис и Потребитель, где Служба будет работать как пользователь, зарегистрированный в Потребителе.
Мой потребитель - это приложение MVC. Моя служба - это приложение Web Api. Оба работают на отдельных серверах в одном домене. Оба установлены для использования Windows Auth.
Мой потребительский код:
private T GenericGet<T>(string p)
{
T result = default(T);
HttpClientHandler handler = new HttpClientHandler() { PreAuthenticate = true, UseDefaultCredentials = true };
using (HttpClient client = new HttpClient(handler))
{
client.BaseAddress = new Uri(serviceEndPoint);
HttpResponseMessage response = client.GetAsync(p).Result;
if (response.IsSuccessStatusCode)
result = response.Content.ReadAsAsync<T>().Result;
}
return result;
}
В моей службе я вызываю User.Identity.Name
, чтобы получить идентификатор вызывающего абонента, но это всегда возвращается в качестве идентификатора пула приложений для клиентов, а не для входа в систему. Потребительский пул приложений работает как сетевая служба, а сам сервер доверен для делегирования. Итак, как я могу получить зарегистрированный пользователь? Сервисный код:
// GET: /Modules/5/Permissions/
[Authorize]
public ModulePermissionsDTO Get(int ModuleID)
{
Module module= moduleRepository.Find(ModuleID);
if (module== null)
throw new HttpResponseException(HttpStatusCode.NotFound);
// This just shows as the App Pool the MVC consumer is running as (Network Service).
IPrincipal loggedInUser = User;
// Do I need to do something with this instead?
string authHeader = HttpContext.Current.Request.Headers["Authorization"];
ModulePermissionsDTO dto = new ModulePermissionsDTO();
// Construct object here based on User...
return dto;
}
В соответствии с этим question Kerberos требуется, чтобы эта настройка работала, потому что HttpClient запускается в отдельном потоке. Однако это меня смущает, потому что я думал, что запрос отправляет заголовок авторизации, и поэтому служба должна иметь возможность использовать это и извлекать токен пользователя. Во всяком случае, я провел некоторое тестирование с Kerberos, чтобы проверить, что это правильно работает в моем домене, используя демо в "Ситуации 5" здесь, и это работает но мои два приложения по-прежнему не будут правильно передавать зарегистрированного пользователя через.
Итак, что мне нужно сделать, чтобы сделать эту работу? Требуется ли Kerberos или мне нужно что-то сделать в моей службе, чтобы распаковать заголовок авторизации и создать основной объект из токена? Все советы были оценены.