この質問には事前におApび申し上げます。私はまだSOが初めてです。
MVC5、EF6、およびVS 2013を使用してWebアプリケーションに取り組んでいます。
リリースされたRCビットへのアップグレードに少し時間を費やしました。そこにあるすべての素晴らしい投稿に感謝します。 Microsoft.AspNet.Identity。*の分離 および asp.net MVCの5.0.0-beta2から5.0.0-rc1への更新 !
私の無限の知恵で、私はRTMビットに移動することにしました: 今後のAsp.Net Identityの変更に早期にアクセスするにはどうすればよいですか? =。最終的にRTM= build。
これは悪夢でしたか、RC1で働いていた基本的なタスクがわからないため、何か(またはその両方)が完全に不足しています。
私はコントローラを介してユーザーにログインしているようですが( Asp.Net IdentityのMicrosoft.AspNet.Identity.Owin.AuthenticationManagerはどこにありますかRTMバージョン? ) ...私のWindowsIdentityは常に空であり、SignInを呼び出した後は認証されませんユーザーとClaimsIdentityオブジェクトが正しく入力されます。
以下は、私が呼び出しているアクションメソッドです(完全性のためにプロパティをローカル変数に移動しました)。
[HttpPost, AllowAnonymous, ValidateAntiForgeryToken]
public virtual async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid) {
var userManager = new UserManager<EtdsUser>(new UserStore<EtdsUser>(new EtdsContext()));
var user = userManager.Find(model.UserName, model.Password);
if (user != null) {
var authenticationManager = HttpContext.GetOwinContext().Authentication;
authenticationManager.SignOut(new[] {DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.ExternalBearer});
var claimsIdentity = await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = model.RememberMe}, claimsIdentity);
return RedirectToLocal(returnUrl);
}
}
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
(補足:現時点では外部ユーザーにログインする必要はありません。)
助言がありますか? -または-すべての変更をロールバックし、VS 2013がRTMdになるまで待つ必要がありますか?
@Hao Kungの元の返信に近づけるように、コードをリファクタリングして更新します。しかし、まだ有効なユーザーIDが得られません。 AuthenticationManagerが正しく割り当てられていないと思いますか?
AuthenticationMangerは現在、次のように定義されています。
public IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } }
SignInAsyncは個別のメソッドになりました。
private async Task SignInAsync(EtdsUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var claimsIdentity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent}, claimsIdentity);
}
「SignOut」の後、デバッガは次を表示します。
AuthenticationManager.User.Identity
{System.Security.Principal.WindowsIdentity}
[System.Security.Principal.WindowsIdentity]: {System.Security.Principal.WindowsIdentity}
AuthenticationType: ""
IsAuthenticated: false
Name: ""
「claimsIdentity」は次のとおりです。
claimsIdentity
{System.Security.Claims.ClaimsIdentity}
Actor: null
AuthenticationType: "ApplicationCookie"
BootstrapContext: null
Claims: {System.Security.Claims.ClaimsIdentity.get_Claims}
IsAuthenticated: true
Label: null
Name: "alon"
NameClaimType: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
RoleClaimType: "http://schemas.Microsoft.com/ws/2008/06/identity/claims/role"
「サインイン」は何も変更しません。
AuthenticationManager.User.Identity
{System.Security.Principal.WindowsIdentity}
[System.Security.Principal.WindowsIdentity]: {System.Security.Principal.WindowsIdentity}
AuthenticationType: ""
IsAuthenticated: false
Name: ""
まだ認証はありませんが、エラーはスローされていないようです。
@Hao Kungが答えたように、StartUp.Auth.csを以下から変更しました:
var authOptions = new CookieAuthenticationOptions { ExpireTimeSpan = TimeSpan.FromHours(4.0)};
app.UseCookieAuthentication(authOptions);
に:
var authOptions = new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromHours(4.0)
}; ...
RTM( ASPNET Identityサンプルコード )からコピーされたコード)で、ログインは基本的に次のようになります。
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
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);
}
編集:そして、Startup.Auth.csで以下の変更が必要です:
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});