在Silverlight中获取当前的Windows用户名

是否有可能使用Silverlight获取当前login用户的用户名? 您可以假定用户具有Windows操作系统,并且Silverlight应用程序托pipe在Internet Explorer中。 使用ASP.NET从服务器端获取身份不是一个选项,这个Silverlight应用程序将托pipe在一个静态HTML文件上。

不幸的是,我不认为这是可能的。

虽然你说我们可以承担Windows操作系统/ IE浏览器,但是Silverlight本身并不会假设这一点,所以大部分通常可用于获取当前登录用户名的正常的.NET机制并不存在于子集可用于Silverlight应用程序的框架:

即。

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

在Silverlight应用程序中都是不可用的,而在Windows窗体应用程序中,每个机制都可以使用。

我想这是有道理的,因为不能保证Silverlight应用程序将在Windows / IE平台上运行。

顺便提一下,这个问题也是在这里问的:

当前的Windows用户名和域名

而这个线程似乎证实了没有本地的方法来实现这一点。 然后线程继续建议从“托管”Silverlight应用程序的ASP.NET页面“注入”当前的ASP.NET用户名。 在Silverlight应用程序本身在客户机的上下文中运行之前。 当然,即使这样做,它也只会从ASP.NET的窗体或基于Windows的身份验证中为您提供ASP.NET用户名,而不是客户端机器当前登录用户的Windows用户名。

你可以设法得到这种方式。

1)创建asp.net web服务应用程序。

2)实现web服务和方法从silverlight应用程序调用。

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

3)在Web服务器上部署此Web服务应用程序。 不要让匿名用户访问这个。

4)将此服务添加到Silverlight应用程序。 (添加服务参考)

5)现在,您可以调用此方法并从整个silverlight应用程序获取用户名。

对这个问题的高度投票答案并没有帮助我。

使用ASP.NET Web服务,这工作,但是:

 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> 

这些是我需要对以前在IIS中使用匿名访问Web服务的Silverlight应用程序所做的唯一值得注意的更改。

我想我会分享这个似乎工作的代码(YMMV)。 它受CraigTP的回答和他提供的链接的启发。 我知道这并不直接回答关于在静态网页中运行的部分,但似乎OP接受了APSX的妥协。

在托管Silverlight的ASPX页面中:

 <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 C#代码中:

  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"); } 
 Environment .GetFolderPath(Environment.SpecialFolder.Personal) .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2]; 

根据这个帖子它不可能在JavaScript中,所以我认为你的运气不好: http : //bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts

听起来像没有真正的方法来做到这一点。

//使用System.IO.Path.DirectorySeparatorChar代码Maverick答案的小改进,而/ /然后//

Environment.GetFolderPath(Environment.SpecialFolder.Personal).Split(new [] {System.IO.Path.DirectorySeparatorChar},StringSplitOptions.RemoveEmptyEntries)[2];