2009-07-24 66 views
20

是否有可能使用Silverlight獲取當前登錄用戶的用戶名?您可以假定用戶具有Windows操作系統,並且Silverlight應用程序託管在Internet Explorer中。使用ASP.NET從服務器端獲取身份不是一種選擇,這個Silverlight應用程序將託管在靜態HTML文件上。在Silverlight中獲取當前Windows用戶名

回答

27

不幸的是,我不認爲這是可能的。

雖然你說我們可以承擔Windows操作系統/ IE瀏覽器,但Silverlight本身肯定不會假設這一點,所以大多數通常可用於獲取當前登錄用戶名的普通.NET機制都不會存在於Silverlight應用程序可用框架的子集內:

ie。

System.Net.CredentialCache.DefaultCredentials 
System.Security.Principal.WindowsIdentity.GetCurrent().Name 
Environment.UserName 

在Silverlight應用程序中都不可用,而在Windows窗體應用程序中(例如),這些機制中的每一個都可以使用。

我想這是有道理的,因爲不能保證Silverlight應用程序將在Windows/IE平臺上運行。

順便說一句,這個問題也有人問在這裏:

Current Windows Username and Domain

和線程似乎證實有實現這一目標沒有原生的方式。然後線程繼續建議從ASP.NET頁面「託管」Silverlight應用程序中「注入」當前的ASP.NET用戶名。在Silverlight應用程序本身在客戶端機器的上下文中運行之前進入Silverlight應用程序本身。當然,即使這樣做,它也只會從ASP.NET的窗體或基於Windows的身份驗證和而不是客戶端計算機的當前登錄用戶的Windows用戶名中爲您提供ASP.NET用戶名。

+0

尼斯的答案!如果不存在任何創造性答案(hack?),我可能會(並且不幸地)將此答案標記爲已接受 – huseyint 2009-07-24 11:29:08

28

你可以設法通過這種方式得到。

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應用程序獲取用戶名。

+0

+1很容易。沒想到會這麼聰明 – christoph 2013-10-30 14:57:29

+0

對我來說Silverlight 5不起作用。 – Roger 2014-12-16 20:29:21

3

我想我會分享這個代碼似乎工作(YMMV)。它受CraigTP的回答以及他提供的鏈接的啓發。我知道這並不直接回答關於在靜態網頁中運行的部分,但似乎OP接受了APSX的妥協。

在我的ASPX頁面承載的Silverlight:

<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"); 
} 
+2

儘管看起來這樣會起作用,但您不能依賴此機制來實現安全性,例如SSO身份驗證。 – Thorarin 2010-11-04 12:05:22

+0

@Thorarin:這對於Windows/Negotiate或NTLM(我認爲是SSO)身份驗證或甚至Basic都可以正常工作。我們在這裏討論的是將用戶名返回給Silverlight客戶端。 在Silverlight中使用這些信息有什麼不確定。任何類型的認證/授權工作通常在服務器上完成 - 尤其是當SL如此沙箱化時。但是,我不會告訴OP不要這樣做,因爲我們不知道整個故事。另外,OP似乎正在尋找創造性的黑客。 – Aardvark 2012-10-18 13:08:13

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需要s此:

<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應用程序的唯一值得注意的變化。

2
Environment 
    .GetFolderPath(Environment.SpecialFolder.Personal) 
    .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2]; 
0

//使用System.IO.Path.DirectorySeparatorChar而// //然後

環境 .GetFolderPath(Environment.SpecialFolder.Personal) .Split(新代碼小牛答案的小的改進[] {System.IO.Path.DirectorySeparatorChar},StringSplitOptions.RemoveEmptyEntries)[2];