Подтвердить что ты не робот

Получить текущее имя пользователя Windows в Silverlight

Возможно ли получить текущее имя пользователя в Silverlight? Вы можете предположить, что у пользователя есть ОС Windows, а приложение Silverlight размещено в Internet Explorer. Получение идентичности с серверной стороны с помощью ASP.NET не является вариантом, это приложение Silverlight будет размещаться в статическом HTML файле.

4b9b3361

Ответ 1

К сожалению, я не думаю, что это возможно.

Хотя вы говорите, что мы можем предположить ОС Windows/IE, сам Silverlight, конечно же, не предполагает этого, поэтому большинство обычных .NET-механизмов, которые обычно доступны для нас, чтобы получить текущее имя пользователя в журнале, не существуют в пределах подмножества структуры, доступной для приложений Silverlight:

т.

System.Net.CredentialCache.DefaultCredentials  
System.Security.Principal.WindowsIdentity.GetCurrent().Name  
Environment.UserName  

все недоступны в приложении Silverlight, тогда как в (скажем) приложении Windows Forms каждый из этих механизмов доступен для использования.

Я полагаю, что это имеет смысл, потому что нет гарантии, что приложение Silverlight будет работать поверх платформы Windows/IE.

Кстати, этот вопрос также был задан здесь:

Текущее имя пользователя и домен Windows

и этот поток, похоже, подтверждает, что для этого не существует собственного способа. Затем поток далее предлагает "ввести" текущее имя пользователя ASP.NET на странице ASP.NET "хостинг" приложения Silverlight. в приложение Silverlight до его запуска в контексте клиентской машины. Конечно, даже если это будет работать, оно даст вам только имя пользователя ASP.NET либо из форм ASP.NET, либо с помощью проверки подлинности на основе Windows, а не из имени пользователя Windows, которое в настоящее время входит в систему пользователя клиентской машины.

Ответ 2

Вы можете обойтись таким образом.

1) Создайте приложение веб-службы asp.net.

2) Внедрите веб-сервис и метод для вызова из приложения silverlight.

[WebMethod]
public string GetClientUserName()
{
    return System.Web.HttpContext.Current.User.Identity.Name.ToString();
}

3) Разверните это приложение веб-службы на веб-сервере. Не разрешайте анонимному пользователю получать к нему доступ.

4) Добавьте эту службу в приложение Silverlight. (Добавить служебную ссылку)

5) Теперь вы можете вызвать этот метод и получить имя пользователя из приложения silverlight.

Ответ 3

Высокие голоса по этому вопросу не помогли мне.

Используя веб-службу ASP.NET, это сработало:

string userName =
   System.ServiceModel.ServiceSecurityContext.Current.WindowsIdentity.Name;

И эта запись в блоге - это тот, который задал мне правильный путь:

http://rouslan.com/2009/03/12/20-steps-to-get-together-windows-authentication-silverlight-and-wcf-service/

ServiceReferences.ClientConfig нуждается в этом:

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding ...>
          <security mode="TransportCredentialOnly" />
        </binding>
      </basicHttpBinding>
    </bindings>
 </system.serviceModel>

И web.config нуждается в этом:

  <system.web>
    <authentication mode="Windows" />
    <identity impersonate="false" />
  </system.web>

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding ...>
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>

Это единственные примечательные изменения, которые я должен был внести в другое приложение Silverlight, которое ранее использовало анонимный доступ для веб-служб в IIS.

Ответ 4

Я решил, что поделюсь этим кодом, который, кажется, работает (YMMV). Это вдохновлено ответом CraigTP и его ссылками, которые он предоставил. Я знаю, что это прямо не отвечает на вопрос о запуске на статической веб-странице, но, похоже, OP принял компромисс APSX.

На моей странице ASPX, на которой размещается Silverlight:

<head>
    <!-- ...snip... -->
    <script runat="server" language="c#">
    void Page_Load()
    {
        this.UsernameField.Value = User.Identity.Name;
    }        
    </script>
</head>
<body>
   <input type="hidden" ID="UsernameField" runat="server" />
   <!-- ...snip... -->
</body>

В моем коде Silverlight С#:

 private string GetCurrentUserName()
 {
     HtmlDocument doc = HtmlPage.Document;

     if (doc == null)
     {
         return string.Empty;
     }

     HtmlElement elm = doc.GetElementById("UsernameField");

     if (elm == null)
     {
         return string.Empty;
     }

     return elm.GetAttribute("value");
 }

Ответ 5

Environment
    .GetFolderPath(Environment.SpecialFolder.Personal)
    .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2];

Ответ 7

//небольшое улучшение ответа Code Maverick с использованием System.IO.Path.DirectorySeparatorChar, а скорее //then//

Окружающая среда   .GetFolderPath(Environment.SpecialFolder.Personal)   .Split(новый [] {System.IO.Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries) [2];