在 Silverlight 中获取当前 Windows 用户名

Posted

技术标签:

【中文标题】在 Silverlight 中获取当前 Windows 用户名【英文标题】:Get current Windows user name within Silverlight 【发布时间】:2010-11-13 16:14:54 【问题描述】:

是否可以使用 Silverlight 获取当前登录用户的用户名?您可以假设用户拥有 Windows 操作系统并且 Silverlight 应用程序托管在 Internet Explorer 中。使用 ASP.NET 从服务器端获取身份不是一种选择,此 Silverlight 应用程序将托管在静态 html 文件中。

【问题讨论】:

【参考方案1】:

你可以通过这种方式获得。

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

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

[WebMethod]
public string GetClientUserName()

    return System.Web.HttpContext.Current.User.Identity.Name.ToString();

3) 在 Web 服务器上部署此 Web 服务应用程序。不允许匿名用户访问。

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

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

【讨论】:

【参考方案2】:

很遗憾,我认为这是不可能的。

虽然您说我们可以假设 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 用户名机器。

【讨论】:

不错的答案!如果没有任何创造性的答案(黑客?),我可能会(不幸的是)将此答案标记为已接受(hack?)【参考方案3】:

对这个问题的高票回答对我没有帮助。

使用 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 应用程序进行的唯一值得注意的更改。

【讨论】:

@MichaelMaddox - 您的链接已损坏,我继续更新它。【参考方案4】:

我想我会分享这个似乎有效的代码 (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");
 

【讨论】:

虽然这看起来可行,但您不能依赖这种安全机制,例如 SSO 身份验证。 @Thorarin:这适用于 Windows/Negotiate 或 NTLM(我对 SSO 的看法)身份验证,甚至是 Basic。我们在这里讨论的只是将用户名返回给 Silverlight 客户端。在 Silverlight 中如何处理这些信息有点令人怀疑。任何类型的身份验证/授权工作通常都在服务器上完成 - 特别是当 SL 被沙盒化时。但是,我不会告诉 OP 不要这样做,因为我们不知道整个故事。另外,OP 似乎正在寻找创造性的技巧。【参考方案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

听起来好像没有真正的方法。

【讨论】:

实际上,我们最初选择了一个 JavaScript 解决方案,并且它奏效了。但它要求用户接受一堆安全对话框,这远非理想。【参考方案7】:

// 使用 System.IO.Path.DirectorySeparatorChar 对 Code Maverick 答案的小幅改进,而不是 // 然后 //

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

【讨论】:

【参考方案8】:

好吧,这里是你如何在没有 wcf 的情况下获得它

http://www.codeproject.com/Articles/47520/Silverlight-Windows-User-Identity-Name

【讨论】:

以上是关于在 Silverlight 中获取当前 Windows 用户名的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.NET 表单身份验证时如何获取当前登录用户的用户 ID?

Silverlight 4 - 将 UIElement 渲染为图像

Silverlight 中 Wave 文件的声音可视化工具

如何在按钮按下事件之外在 Silverlight 中获取鼠标按钮状态?

从foreach循环中获取当前索引[重复]

Silverlight 和应用程序状态