web-dev-qa-db-ja.com

Silverlight内で現在のWindowsユーザー名を取得する

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

20
huseyint

残念ながら、それは不可能だと思います。

Windows OS/IEを想定できるとおっしゃっていますが、Silverlight自体は確かにこれを想定していないため、現在ログオンしているユーザーの名前を取得するために通常利用できる通常の.NETメカニズムのほとんどはサブセット内に存在しません。 Silverlightアプリで利用可能なフレームワークの概要:

すなわち。

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ユーザー名のみが提供され、notクライアントマシンの現在ログオンしているユーザーのWindowsユーザー名。

27
CraigTP

あなたはこの方法でなんとか得ることができます。

1)asp.netWebサービスアプリケーションを作成します。

2)Silverlightアプリケーションから呼び出すWebサービスとメソッドを実装します。

[WebMethod]
public string GetClientUserName()
{
    return System.Web.HttpContext.Current.User.Identity.Name.ToString();
}

3)このWebサービスアプリケーションをWebサーバーにデプロイします。匿名ユーザーにこれへのアクセスを許可しないでください。

4)このサービスをSilverlightアプリケーションに追加します。 (サービス参照を追加)

5)これで、このメソッドを呼び出して、Silverlightアプリケーション全体からユーザー名を取得できます。

28
Richard

この質問に対する投票数の多い回答は私を助けませんでした。

ただし、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アプリケーションに加える必要のある唯一の注目すべき変更です。

7
Michael Maddox

動作しているように見えるこのコード(YMMV)を共有すると思いました。これは、CraigTPの回答と彼が提供したリンクに触発されています。これが静的なWebページでの実行に関する部分に直接答えていないことは知っていますが、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>

私のSilverlightC#コードでは:

 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");
 }
3
Aardvark
Environment
    .GetFolderPath(Environment.SpecialFolder.Personal)
    .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2];
2
ywm

//ではなく//System.IO.Path.DirectorySeparatorCharを使用したCodeMaverickの回答のわずかな改善//

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

0

さて、これがあなたがwcfなしでそれを得る方法です

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

0
Zakos

この投稿によると、javascriptでは不可能なので、運が悪いと思います: http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts

それを行う実際の方法はないようです。

0
SmartyP