是否可以使用Silverlight获取当前登录用户的用户名?您可以假设用户具有Windows操作系统,并且Silverlight应用程序托管在Internet Explorer中。使用ASP.NET从服务器端获取标识不是一个选项,此Silverlight应用程序将托管在静态HTML文件中。
答案 0 :(得分:28)
你可以通过这种方式获得。
1)创建asp.net Web服务应用程序。
2)实现从Silverlight应用程序调用的Web服务和方法。
[WebMethod]
public string GetClientUserName()
{
return System.Web.HttpContext.Current.User.Identity.Name.ToString();
}
3)在Web服务器上部署此Web服务应用程序。不允许匿名用户访问它。
4)将此服务添加到Silverlight应用程序。 (添加服务参考)
5)现在,您可以调用此方法并从整个Silverlight应用程序中获取用户名。
答案 1 :(得分:27)
不幸的是,我认为这不可能。
虽然你说我们可以假设Windows OS / IE,但是Silverlight本身肯定不会假设这一点,所以我们通常可以获得当前登录用户名的大多数普通.NET机制都不存在在Silverlight应用程序可用的框架子集中:
即
System.Net.CredentialCache.DefaultCredentials
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Environment.UserName
在Silverlight应用程序中都不可用,而在(例如)Windows窗体应用程序中,每种机制都可以使用。
我认为这是有道理的,因为无法保证Silverlight应用程序将在Windows / IE平台上运行。
顺便提一下,这个问题也在这里被问到:
Current Windows Username and Domain
并且该线程似乎确认没有本地方法来实现这一点。然后该线程继续建议从“托管”Silverlight应用程序的ASP.NET页面“注入”当前的ASP.NET用户名。在客户机的上下文中运行之前,进入Silverlight应用程序本身。当然,即使这样可行,它也只会从ASP.NET的表单或基于Windows的身份验证中提供ASP.NET用户名,而不当前登录的客户端用户的Windows用户名机。
答案 2 :(得分:7)
对这个问题的高度评价的答案对我没有帮助。
使用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>
这是我需要对其他工作的Silverlight应用程序进行的唯一值得注意的更改,以前在IIS中使用匿名访问Web服务。
答案 3 :(得分:3)
我想我会分享这个似乎有用的代码(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");
}
答案 4 :(得分:2)
Environment
.GetFolderPath(Environment.SpecialFolder.Personal)
.Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2];
答案 5 :(得分:0)
根据这篇文章它在javascript中不可能,所以我认为你的运气不好: http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts
听起来没有真正的方法可以做到。
答案 6 :(得分:0)
//使用System.IO.Path.DirectorySeparatorChar对Code Maverick的一个小改进,而不是//然后//
环境 .GetFolderPath(Environment.SpecialFolder.Personal) .Split(new [] {System.IO.Path.DirectorySeparatorChar},StringSplitOptions.RemoveEmptyEntries)[2];
答案 7 :(得分:0)
嗯,这是你如何在没有wcf的情况下得到它
http://www.codeproject.com/Articles/47520/Silverlight-Windows-User-Identity-Name