Попытка получить имя пользователя Windows клиента с помощью WCF - PullRequest
0 голосов
/ 02 августа 2011

Я пытаюсь получить имя пользователя Windows клиента, который обращается к странице ASP.NET, размещенной на моем локальном IIS.Я называю службу WCF на странице ASP.NET, которая возвращает имя пользователя Windows клиента.Я сталкивался с таким количеством сообщений, и большинство из них предлагают, чтобы

  1. OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name
  2. HttpContext.Current.User.Identity.Name
  3. HttpContext.Current.User.Identity.Name

должно работать.Проблемы, с которыми я сталкиваюсь, это «1», всегда возвращаемое значение Null.«2» и «3» всегда возвращают мое локальное имя пользователя, а не запрашивающее имя пользователя.Я что-то упустил в web.configs как службы ASP.NET, так и службы WCF.

Свойства IIS: встроенная проверка подлинности Windows включена.

Вот код.

WCF

public string GetWindowsUser()    
{
   string temp = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
   string temp1 = HttpContext.Current.User.Identity.Name;
   string temp2 = HttpContext.Current.User.Identity.Name;
   return "Temp: "+temp+" \nTemp1: "+temp1+" \nTemp2: "+temp2;
}

WEB.Config

<system.web>
    <compilation debug="false" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                    <message clientCredentialType="UserName" algorithmSuite="Default"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:4772/Services.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="WindowsAuthServices.IService1" name="BasicHttpBinding_IService1"/>
    </client>
</system.serviceModel>

Страница ASP.NET:

protected void Page_Load(object sender, EventArgs e)
{
    WindowsAuthServices.Service1Client client = new WindowsAuthServices.Service1Client();
    lblWelcome.Text = client.GetWindowsUser();
}

Web.Config

<system.web>
    <compilation debug="true" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                    <message clientCredentialType="UserName" algorithmSuite="Default"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:4772/Services.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="WindowsAuthServices.IService1" name="BasicHttpBinding_IService1"/>
    </client>
</system.serviceModel>

Ответы [ 4 ]

1 голос
/ 02 августа 2011

Это потому, что ваш вызов выполняется от имени пользователя, под которым выполняется рабочий процесс ASP.Net, а не от имени пользователя, запрашивающего страницу (что называется олицетворением).

От http://geekswithblogs.net/robz/archive/2007/10/03/wcf-impersonation---specifying-windows-authentication-credentials-on-the-service.aspx

1) В файле web.config клиента ASP.NET необходимо было настроить олицетворение с использованием следующей разметки (я поместил ее под элементом аутентификации, как показано на рисунке):

<authentication mode="Windows"/>
<identity impersonate="true"/>

2Поведение службы должно быть настроено на использование Windows для разрешений и олицетворение вызывающих абонентов.

<serviceBehaviors>
    <behavior name="XXX.XXXXXXXXXXXX">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceAuthorization principalPermissionMode="UseWindowsGroups" impersonateCallerForAllOperations="true" />
    </behavior>
</serviceBehaviors>
0 голосов
/ 13 августа 2011

Я наконец нашел решение.Когда другой пользователь пытается получить доступ к моему локальному IIS с использованием IP-адреса, мой локальный IIS предполагает, что это интернет-запрос, а не запрос интрасети, и, поскольку его проверка подлинности Windows, он работает только с запросами интрасети.Чтобы решить эту проблему, я должен был разместить свой сайт на одном из наших доменных серверов.Поскольку сервер домена уже настроен так, что только пользователи в этом домене могут получить к нему доступ, теперь у него есть данные для входа в Windows.И на этом мои страдания заканчиваются.

0 голосов
/ 02 августа 2011

Похоже, вам нужно реализовать / настроить свой веб-сайт для делегирования удостоверений. Если вам нужно настроить WCF для делегирования, ознакомьтесь с этой статьей MSDN.

0 голосов
/ 02 августа 2011

Наше предприятие хочет, чтобы его сайт открывали только те, которые используют компанию устройства (ноутбуки). Поэтому они хотят, чтобы сайт sharepoint использовал Windows аутентификация и не запрашивая имя пользователя и пароль. Если Имя пользователя Windows совпадает с именем в списке одобренных пользователей. следует открыть или перенаправить на другую страницу аутентификации. получение 1-ая часть сделана была проблемой.

Таким образом, вам просто нужно, чтобы ваши ноутбуки были подключены к домену Windows и использовать встроенную безопасность и установить правильные группы безопасности в Sharepoint.

То, что вы описываете, не является безопасностью и никогда не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...