現在ログインしているユーザーのユーザー名を Silverlight で取得することはできますか? ユーザーが Windows OS を使用しており、Silverlight アプリケーションが Internet Explorer でホストされていると想定できます。ASP.NET を使用してサーバー側から ID を取得することはできません。この Silverlight アプリケーションは、静的な HTML ファイルでホストされます。
8 に答える
この方法でなんとか乗り切れます。
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 アプリケーション全体からユーザー名を取得できます。
残念ながら、それは不可能だと思います。
あなたは Windows OS/IE を想定できると言っていますが、Silverlight 自体は確かにこれを想定していないため、現在ログオンしているユーザーの名前を取得するために通常使用できる通常の .NET メカニズムのほとんどは、サブセット内には存在しません。 Silverlight アプリで利用できるフレームワーク:
すなわち。
System.Net.CredentialCache.DefaultCredentials
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Environment.UserName
Silverlight アプリケーション内ではすべて使用できませんが、(たとえば) Windows フォーム アプリケーションでは、これらの各メカニズムを使用できます。
Silverlight アプリケーションが Windows/IE プラットフォーム上で実行されるという保証はないので、これは理にかなっていると思います。
ちなみに、この質問もここで尋ねられました:
そのスレッドは、これを達成するネイティブな方法がないことを確認しているようです。次にスレッドは、Silverlight アプリを「ホスト」している ASP.NET ページから現在の ASP.NET ユーザー名を「注入」することを提案します。クライアントのマシンのコンテキストで実行される前に、Silverlight アプリケーション自体に。もちろん、これが機能したとしても、現在クライアント マシンにログオンしているユーザーの Windows ユーザー名ではなく、 ASP.NET のフォームまたは Windows ベースの認証から ASP.NET ユーザー名のみが提供されます。
この質問に対する投票数の多い回答は役に立ちませんでした。
ただし、ASP.NET Web サービスを使用すると、これは機能しました。
string userName =
System.ServiceModel.ServiceSecurityContext.Current.WindowsIdentity.Name;
そして、このブログエントリは、私を正しい道に導いたものです:
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 アプリケーションを別の方法で動作させるために必要だった注目すべき変更は、これだけです。
動作しているように見えるこのコード(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");
}
Environment
.GetFolderPath(Environment.SpecialFolder.Personal)
.Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2];
まあ、これがwcfなしでそれを得る方法です
http://www.codeproject.com/Articles/47520/Silverlight-Windows-User-Identity-Name
// System.IO.Path.DirectorySeparatorChar を使用した Code Maverick の回答の小さな改善 // 次に //
Environment .GetFolderPath(Environment.SpecialFolder.Personal) .Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries)[2];
この投稿によると、javascript では不可能なので、運が悪いと思います: http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts
それを行う本当の方法はないようです。