是否可以使用 Silverlight 获取当前登录用户的用户名?您可以假设用户具有 Windows 操作系统并且 Silverlight 应用程序托管在 Internet Explorer 中。使用 ASP.NET 从服务器端获取身份不是一种选择,此 Silverlight 应用程序将托管在静态 HTML 文件上。
8 回答
你可以设法通过这种方式。
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 应用程序中获取用户名。
不幸的是,我认为这是不可能的。
尽管您说我们可以假设 Windows OS/IE,但 Silverlight 本身当然不会假设这一点,因此我们通常可以用来获取当前登录用户名的大多数正常 .NET 机制不存在于子集中Silverlight 应用程序可用的框架:
IE。
System.Net.CredentialCache.DefaultCredentials
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Environment.UserName
在 Silverlight 应用程序中都不可用,而在(例如)Windows 窗体应用程序中,这些机制中的每一个都可以使用。
我认为这是有道理的,真的,因为不能保证 Silverlight 应用程序将在 Windows/IE 平台之上运行。
顺便说一句,这里也有人问过这个问题:
并且该线程似乎确认没有本地方法可以实现这一目标。然后该线程继续建议从“托管”Silverlight 应用程序的 ASP.NET 页面“注入”当前 ASP.NET 用户名。在 Silverlight 应用程序本身在客户端计算机的上下文中运行之前将其导入。当然,即使这可行,它也只会为您提供来自 ASP.NET 表单或基于 Windows 的身份验证的 ASP.NET 用户名,而不是客户端计算机当前登录用户的 Windows 用户名。
这个问题的高度投票答案对我没有帮助。
但是,使用 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 对 Code Maverick 答案进行小幅改进 // 然后 //
环境 .GetFolderPath(Environment.SpecialFolder.Personal) .Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries)[2];
好吧,这就是你如何在没有 wcf 的情况下获得它
http://www.codeproject.com/Articles/47520/Silverlight-Windows-User-Identity-Name