20

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

4

8 回答 8

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 应用程序中获取用户名。

于 2009-12-03T02:53:08.860 回答
27

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

尽管您说我们可以假设 Windows OS/IE,但 Silverlight 本身当然不会假设这一点,因此我们通常可以用来获取当前登录用户名的大多数正常 .NET 机制不存在于子集中Silverlight 应用程序可用的框架:

IE。

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 用户名。

于 2009-07-24T10:25:48.307 回答
7

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

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

于 2011-05-25T17:15:42.157 回答
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");
 }
于 2010-03-25T18:45:58.360 回答
2
Environment
    .GetFolderPath(Environment.SpecialFolder.Personal)
    .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2];
于 2011-11-25T14:51:04.653 回答
0

根据这篇文章,它在 javascript 中是不可能的,所以我认为你不走运: http ://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts

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

于 2009-07-24T14:54:33.847 回答
0

// 使用 System.IO.Path.DirectorySeparatorChar 对 Code Maverick 答案进行小幅改进 // 然后 //

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

于 2014-06-19T05:22:39.203 回答
0

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

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

于 2015-02-17T13:51:36.507 回答