是否有可能使用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;
而这个博客条目正是让我走上了正确的道路:
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];
那么,这里是如何得到它wihtout wcf
http://www.codeproject.com/Articles/47520/Silverlight-Windows-User-Identity-Name