2009-07-24 20 views
20

Silverlightで現在ログインしているユーザーのユーザー名を取得できますか?ユーザーにはWindows OSがあり、SilverlightアプリケーションはInternet Explorerでホストされていると想定できます。 ASP.NETでサーバー側からIDを取得することはできません。このSilverlightアプリケーションは静的HTMLファイルでホストされます。Silverlightで現在のWindowsユーザー名を取得

答えて

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プラットフォームの上で動作することは保証されていないので、それは理にかなっていると思います。

ところで、この質問にもこっちに頼まれた:

Current Windows Username and Domain

とそのスレッドは、これを達成するためのネイティブ方法がないことを確認しているようです。スレッドは次に、Silverlightアプリケーションを「ホスティング」しているASP.NETページから現在のASP.NETユーザー名を「注入」するよう提案します。クライアントのマシンのコンテキストで実行する前に、Silverlightアプリケーション自体に追加する必要があります。もちろん、たとえこれが機能しても、ASP.NETのフォームまたはWindowsベースの認証のいずれかからASP.NETユーザー名が得られ、ではなく、クライアントコンピュータの現在ログオンしているユーザーのWindowsユーザー名が与えられます。

+0

ニース答えwihtoutそれを得ることができる方法です! – huseyint

0

本によると、JavaScriptでそのことはできません投稿、私は運のあなたのアウトを考える:それを行うには現実的な方法がないよう http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts

が鳴ります。

+0

実際に私たちは最初にJavaScriptソリューションを探していましたが、それはうまくいきました。しかし、それは理想的ではない遠隔地のセキュリティダイアログを受け入れる必要があります。 – huseyint

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アプリケーション全体からユーザー名を取得できます。

+0

+1かなり簡単です。 – christoph

+0

Silverlight 5で私にとってうまくいきません。 – Roger

3

私はこのコードを共有すると思っていましたが、これはうまくいくようです(YMMV)。それはCraigTPの答えと彼が提供した彼のリンクに触発されています。私はこれが静的なWebページで実行することについての部分に直接答えないことを知っていますが、OPはAPSXの妥協を受け入れたようです。私のSilverlight C#のコードで

<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をホストする私のASPXページで

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

+0

@ Thorarin:これは、Windows/NegotiateやNTLM(SSOのために考えているもの)の認証や基本的にはうまく動作します。ここでは、ユーザー名をSilverlightクライアントに戻しているだけです。 Silverlightでこの情報を使用したことは、やや疑わしいものです。あらゆるタイプの認証/認可作業は、SLがそのようにサンドボックス化されている場合、通常はサーバー上で実行されます。しかし、私は全体の話を知らないので、これをしないようOPに言いません。加えて、OPは創造的なハッキングを探しているようだ。 – Aardvark

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アプリケーションを作るために必要な唯一の注目すべき変化があります。

その後、
+0

+1 'system.web'は必須です!それを強調してくれてありがとう... – Legend

+0

@MichaelMaddox - あなたのリンクが壊れていた、私は先に進み、それを更新しました。 –

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

ランタイムエラー:アクセスが拒否されました。 –

0

// System.IO.Path.DirectorySeparatorCharを使用してコードマーベリックの答えの小さな改善ではなく// //

環境 .GetFolderPath(Environment.SpecialFolder.Personal) .Split(新[] {System.IO.Path.DirectorySeparatorChar}、StringSplitOptions.RemoveEmptyEntries)[2];

関連する問題