イントラネットのみの設定で使用される MVC5 サイトを構築しています。ここの社員はPCを共有して仕事をしているため、サイトにログイン/ログオフ機能を組み込む必要があります。アプリケーションは Active Directory に対して認証されます。
ここで認証が機能しています。ただし、ページがユーザーを returnUrl に戻すと、User.Identity.IsAuthenticated
とのRequest.IsAuthenticated
両方が false になります。これにより、以前にその動作を正常に完了したにもかかわらず、ホームページに「サインイン」のオプションが引き続き提供されます。
ユーザーが正常にサインオンしたことを MVC に通知するにはどうすればよいですか?
Web.config から:
<authentication mode="Windows" />
アカウント コントローラーから:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
using (var pc = new PrincipalContext(ContextType.Domain))
{
if (pc.ValidateCredentials(model.UserName, model.Password, ContextOptions.Negotiate | ContextOptions.SimpleBind))
{
FormsAuthentication.SetAuthCookie(model.UserName, false);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
}
更新
デフォルトの MVC コードは、標準のインターネット ログイン用にこのメソッドを作成します。オブジェクトを生成する方法を理解しようとしているClaimsIdentity
ので、それを利用することもできます。
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}