自分の認証システムを使用していて、必要なビットのみを使用しています。私の解決策は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")]属性を削除してもエラーは発生します。
私は「世俗的な詳細を混乱させた」とか、どこか分からないと思っています。
解決策はとても簡単でした....うわー...ありがとう! – antony