Получить имя пользователя текущего взаимодействующего пользователя в 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 4

2 ответа:

Инструкция, предложенная @Ryand.Джонсон прав. Дело здесь в том, что контроллер не отправляет никаких учетных данных в веб-службу, потому что он работает под asp.net индентирование пользователя не является идентификацией текущего пользователя loggedd. Единственный способ передать удостоверение прокси-серверу-это встроить вызов веб-службы в контекст олицетворения следующим образом:

using (WindowsImpersonationContext impersonatedUser = (User.Identity as System.Security.Principal.WindowsIdentity).Impersonate()){ 
     //your proxy call here  }

Если все еще таким образом вы получаете null, вы должны вручную установить учетные данные по умолчанию для вашего прокси

Да, в контексте безопасности Службы...

OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name