2016-10-29 14 views
0

公式のasp.netドキュメント(https://docs.asp.net/en/latest/security/authentication/cookie.html)に記載されているように、ASP.NETコアからCookieミドルウェアを使用してカスタム認証を作成しようとしました。クッキーミドルウェアが正しくクッキーを設定していない

残念ながら、私のASP.NET MVCプロジェクトでは機能しません。「HttpContext.Authentication.SignInAsync」を呼び出した後にクッキーが設定されていません。

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseDatabaseErrorPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     app.UseStaticFiles(); 

     app.UseIdentity(); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions() 
     { 
      AuthenticationScheme = "CookieInstance", 
      LoginPath = new PathString("/Account/Login/"), 
      AccessDeniedPath = new PathString("/Account/Forbidden/"), 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      CookieSecure = env.IsDevelopment() 
       ? CookieSecurePolicy.None 
       : CookieSecurePolicy.Always     
     });    

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 

ログインコントローラ

[HttpPost] 
    [AllowAnonymous] 
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) 
    { 
     if (ModelState.IsValid && model.Email == "[email protected]") 
     { 

      var claims = new List<Claim> { 
       new Claim(ClaimTypes.Name, "Kev", ClaimValueTypes.String) 
      }; 

      var userIdentity = new ClaimsIdentity(claims, "CookieInstance"); 

      var userPrincipal = new ClaimsPrincipal(userIdentity); 

      await HttpContext.Authentication.SignInAsync("CookieInstance", userPrincipal, 
       new AuthenticationProperties 
       { 
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20), 
        IsPersistent = false, 
        AllowRefresh = false 
       });      

      return RedirectToLocal(returnUrl); 
     } else { ... } 

    ... 
    } 

それが正常にページを修正するために私をリダイレクトしませんが、apparentelyクッキーの意志:ここ

は私の現在のコードです設定する。たとえば、SignInManager.IsSignedIn(User)はまだfalseを返しています。

解決方法はありますか?

おかげ

+0

あなたはクッキーが作成されていないことを確認するためにWebブラウザのdevツールを使用しましたか? ClaimTypes.NameIdentifierクレーム –

+0

が必要な場合もあります。SignInManagerは、独自のCookieミドルウェアを設定しているので使用しているように見えないIdentityシステムの一部です。 –

答えて

1

あなたはASP.NETアイデンティティを使用しようとしている場合はSignInManagerすなわち

SignInManager.IsSignedIn(User) 
方法は、あなたはそれがデフォルトIdentityOptionsからauthschemeをので、使用している定義された同じ認証方式を使用していない

それは偽を報告するでしょう、あなたの認証クッキーが表示されません。

そのメソッドの実際のコードは次のようである:

public virtual bool IsSignedIn(ClaimsPrincipal principal) 
    { 
     if (principal == null) 
     { 
      throw new ArgumentNullException(nameof(principal)); 
     } 
     return principal?.Identities != null && 
      principal.Identities.Any(i => i.AuthenticationType == Options.Cookies.ApplicationCookieAuthenticationScheme); 
    } 

ますので、そのコード内のオプションがIdentityOptionsとクッキーのプロパティであることを自分自身の認証スキーム

ノートと同様のチェックを行うことができますアイデンティティのためのCookieAuthOptionsです

+0

OKです。したがって、どのように私がクッキーにアクセスできるか、またはユーザーが認証されているかどうかを確認するためのヒントを教えてください。 – Bluesight

+1

私はあなたが(User.Identity.IsAuthenticated) –

+0

私の答えを編集したかどうかを確認できるはずだと思います。 –

関連する問題