Возможно ли получить текущее имя пользователя в Silverlight? Вы можете предположить, что у пользователя есть ОС Windows, а приложение Silverlight размещено в Internet Explorer. Получение идентичности с серверной стороны с помощью ASP.NET не является вариантом, это приложение Silverlight будет размещаться в статическом HTML файле.
Получить текущее имя пользователя Windows в Silverlight
Ответ 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;
И эта запись в блоге - это тот, который задал мне правильный путь:
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];
Ответ 6
в соответствии с этим сообщением его невозможно в javascript, поэтому я думаю, что вам не повезло: http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts
звучит так, будто нет реального способа сделать это.
Ответ 7
//небольшое улучшение ответа Code Maverick с использованием System.IO.Path.DirectorySeparatorChar, а скорее //then//
Окружающая среда .GetFolderPath(Environment.SpecialFolder.Personal) .Split(новый [] {System.IO.Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries) [2];
Ответ 8
ну, вот как вы можете получить это witout wcf
http://www.codeproject.com/Articles/47520/Silverlight-Windows-User-Identity-Name