2017-09-05 10 views
2

私はクッキーを使用して認証を有効にしている:なぜ私のクッキー認証がasp .netコアで動作しないのですか?

using Microsoft.AspNetCore.Builder; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 
using WebBasic.Core.Controllers; 

namespace WebBasic.Core 
{ 
    public class Startup 
    { 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 
     services.AddAuthentication().AddCookie(AuthController.AuthControllerAuthId); 
     services.AddAuthorization(options => { options.AddPolicy("IsFoo", policy => policy.RequireClaim("FooType")); }); 
    } 

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory) 
    { 
     app.UseMvc(); 
     app.UseAuthentication(); 
    } 
    } 
} 

...および特許請求の範囲をテストするための一般的なビューを作成しました:

using System.Collections.Generic; 
using System.Linq; 
using System.Security.Claims; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Authentication; 
using Microsoft.AspNetCore.Mvc; 

namespace WebBasic.Core.Controllers 
{ 
    [Route("/api/[controller]/[action]")] 
    public class AuthController : Controller 
    { 
    public const string AuthControllerAuthId = "AuthControllerAuthId"; 

    public IActionResult Test() 
    { 
     var claims = string.Join(", ", User.Claims.Select(i => i.Type)); 
     return Ok($"{User.Identity.IsAuthenticated}: {claims}"); 
    } 

    public async Task<IActionResult> AuthFixed() 
    { 
     var claims = new List<Claim> {new Claim("FooType", "FooValue", ClaimValueTypes.String)}; 
     var userIdentity = new ClaimsIdentity(claims); 
     var userPrincipal = new ClaimsPrincipal(userIdentity); 
     await HttpContext.SignInAsync(AuthControllerAuthId, userPrincipal); 
     return Ok("ok"); 
    } 

    public async Task<IActionResult> Logout() 
    { 
     await HttpContext.SignOutAsync(AuthControllerAuthId); 
     return Ok("ok"); 
    } 
    } 
} 

私は/api/auth/authfixed/クッキーのセットを取得する場合:

Cache-Control:no-cache 
Content-Type:text/plain; charset=utf-8 
Date:Tue, 05 Sep 2017 13:57:39 GMT 
Expires:-1 
Pragma:no-cache 
Server:Kestrel 
Set-Cookie:.AspNetCore.AuthControllerAuthId=...; path=/; samesite=lax; httponly 

を...私がapi/auth/testに戻ると、私は得る:

False 

ie。私は認証されていませんか?認証ミドルウェアがクッキーを取得していませんか?何故なの?

私は[Authorize]を追加する場合、私は得る:

System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. 
at Microsoft.AspNetCore.Authentication.AuthenticationService.<ChallengeAsync>d__11.MoveNext() 

???なぜ私はそれを明示的に設定する必要がありますか?私が知っている

、私はCookieAuthenticationDefaults.AuthenticationSchemeにDefaultChallengeScene、DefaultAuthenticationSchemeとDefaultSchemeを設定することができますが、すべてのことは、実際には、文字列「クッキー」に設定されず、それはまだ動作しません。

ここで実際に何が起こっていますか?

+0

'App.UseMvc();の前に' configure'メソッドで 'app.UseAuthentication();'を入れようとしましたか? – Ali

答えて

3

この問題を抱えている他の人にとっては、すべてのコンポーネントが同じIDを参照する必要があるということです。

私のケースでは、Cookieの代わりにAuthControllerAuthIdを自分のカスタム認証識別子として使用していました。私が必要としたのは、認証チェーンのすべての部分がこの値を使用していることを確認することでした。

var userIdentity = new ClaimsIdentity(claims, AuthControllerAuthId); 
var userPrincipal = new ClaimsPrincipal(userIdentity); 

がで署名:しかし、具体的私の場合には、

await HttpContext.SignInAsync(AuthControllerAuthId, userPrincipal); 

すべてが実際に働いていた、ClaimsIdentity構築するとき

services.AddAuthentication(options => 
    { 
    options.DefaultChallengeScheme = AuthController.AuthControllerAuthId; 
    options.DefaultAuthenticateScheme = AuthController.AuthControllerAuthId; 
    options.DefaultScheme = AuthController.AuthControllerAuthId; 
    }).AddCookie(AuthController.AuthControllerAuthId) 

は、認証を追加する場合トリックはのAuthenticationTypeを見ることですすべてのステップで正しく設定されていることを確認してください。

関連する問題