Получить имя пользователя текущего взаимодействующего пользователя в WCF как REST Endpoint, так и MVC3 с проверкой подлинности Windows
В проекте MVC3, над которым я работаю, мы пытаемся переместить большую часть нашей логики, которая в настоящее время находится в контроллерах, на уровень сервиса и представить ее как службу REST в WCF.
Так и в нашем глобальном.asax мы создаем маршрут обслуживания следующим образом:
RouteTable.Routes.Add(new ServiceRoute
("Exampleservice", new WebServiceHostFactory(), typeof(ExampleService)));
И наши контроллеры получают доступ к сервису примерно так:
public class ExampleController : Controller {
private IExampleService service;
public ExampleController() {
this.service = new ExampleService();
}
public ActionResult Index() {
var results = service.GetAll();
return View(results);
}
}
Главное здесь то, что мы используем класс сервиса напрямую (без выполнения запросов по сети с помощью HttpClient).
Наши сайт использует аутентификацию Windows (это сайт интрасети), и мы хотели бы сохранить его таким образом. Мой вопрос в том, есть ли способ, которым я могу получить удостоверение пользователя в классе service, который будет работать как для того, как у нас есть контроллеры, использующие службу, так и для того, как WCF использует службу?
Например:
[ServiceContract]
public interface IExampleService
{
[WebGet(UriTemplate = "/")]
List<Results> GetAll();
}
public class ExampleService : IExampleService
{
List<Results> GetAll() {
// Get User Name Here
// In ASP.Net I would use User.Identity.Name
// If I was just worrying about the the REST service I would use
// ServiceSecurityContext.Current.WindowsIdentity.Name
}
}
2 ответа:
Инструкция, предложенная @Ryand.Джонсон прав. Дело здесь в том, что контроллер не отправляет никаких учетных данных в веб-службу, потому что он работает под asp.net индентирование пользователя не является идентификацией текущего пользователя loggedd. Единственный способ передать удостоверение прокси-серверу-это встроить вызов веб-службы в контекст олицетворения следующим образом:
using (WindowsImpersonationContext impersonatedUser = (User.Identity as System.Security.Principal.WindowsIdentity).Impersonate()){ //your proxy call here }
Если все еще таким образом вы получаете null, вы должны вручную установить учетные данные по умолчанию для вашего прокси