ASP.NET Core RC2を使用してMVC6で構築されたイントラネットサイトがあります。イントラネットサイトにアクセスしているユーザーのWindowsユーザー名を取得したい。
したがって、ジムがイントラネットサイトにアクセスする場合、サイトに「Domain\Jim」を受信させ、アンがイントラネットサイトにアクセスする場合、サイトに「Domain\Anne」を受信させます。
Windows認証のみがmy IISサーバーで有効になっています。匿名認証は無効になっています。
私のサイトは、Windows認証を使用し、匿名認証を無効にするように設定されています。
_<system.web>
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
</system.web>
_
デバッグを通じてSystem.Security.Principal.WindowsIdentity.GetCurrent().Name
を使用できますが、もちろんIISサーバー上で "IIS APPPOOL\SiteName"を返します。
HttpContextを使用して古いバージョンのASP.NETから多くの例を見つけ、それを次のようにコントローラーに注入しようとしましたが、userNameはnullになります。
_//Startup.cs
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//HomeController.cs
public HomeController(IHttpContextAccessor _accessor)
{
string userName = _accessor.HttpContext.User.Identity.Name;
}
_
Windowsユーザー名をASP.NET Core RC2 MVC6のイントラネットサイトに渡す正しい方法は何ですか?
ユーザーに関する情報を取得できるようにしたいだけの、イントラネットアプリでWindows認証を使用している他のユーザーにとっては、考えた方が簡単です。
コントローラーでは、この行は現在のユーザーのユーザー名をDOMAIN\username形式で取得します。
var userId = this.User.Identity.Name;
私はしばらく時間をかけて他の回答を調べましたが、ほとんどの回答は、Windows認証ではなく、ADに対して認証される個人アカウントを実装していると想定していました。
まだ探している人を助けるかもしれません。 MSのドキュメント https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2 に従って、ConfigureServicesメソッドにHttpContextAccessorを追加します(スタートアップ。 cs)このhttpcontextaccessorをコントローラーに渡し、ログインしているユーザーにアクセスします。
私はこれに従い、コアWebサイトをIISに展開した後でも、ログインしたWindows認証ユーザーを取得することができました。
ここにコードスニペットがあります
Startup.cs(ConfigureServicesメソッドの下)に次の行を追加します
services.AddHttpContextAccessor();
次に、コントローラーファイルで、次の必要なコード行を追加します。以下のコードはサンプルです。
public YourController : Controller
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly string _user;
public YourController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_user = _httpContextAccessor.HttpContext.User.Identity.Name;
}
}
ServiceSecurityContext.Current?.PrimaryIdentity
var userId = this.User.Identity.Name;
を使用するとうまくいきました。私のアプリはイントラネット上で実行されており、私が探していたのはWindowsからユーザーのログインIDを取得することだけです。ユーザーの情報は既にActive Directoryに保存されているため、保存する必要はありませんでした。