2017-03-27 24 views
2

自分の認証システムを使用していて、必要なビットのみを使用しています。私の解決策はthis github repoに基づいています。私は同様の質問を見直しましたが、私の状況に合わないようです。私はthis post about Authentication and JWTも読んでいますが、それが適切かどうかはわかりません。道に迷いました。提供された偽造防止トークンは、現在のユーザーとは異なるクレームベースのユーザーのためのものです

マイStartup.cs:予想通り

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = "Cookies", 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      LoginPath = new PathString("/auth/login") 
     }); 

     app.UseClaimsTransformation(context => 
     { 
      if (context.Principal.Identity.IsAuthenticated) 
      { 
       context.Principal.Identities.First().AddClaim(new Claim("now", DateTime.Now.ToString())); 
      } 

      return Task.FromResult(context.Principal); 
     }); 

私認証コントローラが動作します。ここでは、[ValidateAntiForgeryToken]を使用するログインアクションです。ただし、コントローラ全体が[AllowAnonymous]に設定されています。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Login(LoginViewModel viewModel, string returnUrl = null) 
    { 
     ViewData["ReturnUrl"] = returnUrl; 

     if (ModelState.IsValid) 
     { 
      var result = await _userManager.LoginUserAsync(viewModel.UserName, viewModel.Password, viewModel.RememberMe); 
      if (result.Success) 
      { 
       // TODO: Log successful login 

       var claims = new List<Claim> 
       { 
        new Claim(ClaimTypes.Name, result.User.FullName), 
        new Claim(ClaimTypes.Email, result.User.Email) 
       }; 

       foreach(var role in result.User.Roles) 
       { 
        claims.Add(new Claim(ClaimTypes.Role, role.Name)); 
       } 

       var identity = new ClaimsIdentity(claims, "password"); 
       var principal = new ClaimsPrincipal(identity); 

       await HttpContext.Authentication.SignInAsync("Cookies", principal); 

       return LocalRedirect(returnUrl); 
      } 
      else 
      { 
       AddModelErrors(result); 
       return View(viewModel); 
      } 
     } 

     // Doh! 
     return View(viewModel); 
    } 

これまでのところ、とても良いです。

ここで、エラー(400 Bad Request)が表示されます。中(ポスト)を作成する方法:

[Authorize(Roles = "Admin")] 
public class UserAdministrationController : Controller 
{ 
    private readonly IUserManager _userManager; 
    private readonly IUserAdminViewModelFactory _userAdminViewModelFactory; 

    public UserAdministrationController(
     IUserManager userManager, 
     IUserAdminViewModelFactory userAdminViewModelFactory 
     ) 
    { 
     _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager)); 
     _userAdminViewModelFactory = userAdminViewModelFactory ?? throw new ArgumentNullException(nameof(userAdminViewModelFactory)); 
    } 


    [HttpGet] 
    public IActionResult Index() 
    { 
     var userViewModels = _userAdminViewModelFactory.CreateUserViewModelList(); 
     return View(userViewModels); 
    } 

    [HttpGet] 
    public IActionResult Create() 
    { 
     var createUserViewModel = _userAdminViewModelFactory.CreateUserViewModel(); 
     return View(createUserViewModel); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public IActionResult Create(CreateUserViewModel viewModel) 
    { 
     return View(); 
    } 
} 

実際には、この方法は、このエラーが原因発射することはありません:

Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The
provided antiforgery token was meant for a different claims-based user than the current user. at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.ValidateTokens(HttpContext httpContext, AntiforgeryTokenSet antiforgeryTokenSet) at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.d__9.MoveNext()

私は[ValidateAntiForgeryToken]を削除した場合、私は、エラーを受信しません。ただし、[Authorize(Roles = "Admin")]属性を削除してもエラーは発生します。

私は「世俗的な詳細を混乱させた」とか、どこか分からないと思っています。

答えて

1

偽造防止トークンが構築される前にユーザーを設定してください。これは、偽造防止トークンがユーザークレームを使用して構築されているためです。

... 
await HttpContext.Authentication.SignInAsync("Cookies", principal); 
HttpContext.User = principal; 
... 
+0

解決策はとても簡単でした....うわー...ありがとう! – antony

関連する問題