開発中の e コマース ソリューションでは、AspNet Identity 2.2.1 を使用しており、ゲスト (匿名) ユーザーは Web サイトに事前登録せずにチェックアウトを完了する必要があります。この要件を満たすために、Cookie から SessionTrackId (文字列 GUID) を取得する UserMigrationAttribute という名前の ActionFilter を作成しました。ユーザー名は、SessionTrackId@mydomain.com のようなものです。
サイト全体でその機能を利用するために、この UserMigration 属性で BaseController クラスを装飾しました。
この時点までのすべては、単一の欠点の問題で期待どおりに機能します。これは、任意のユーザーに対してページが初めて読み込まれるときです。[ValidateAntiForgeryToken]
属性を持つメソッドへの Jquery Ajax 呼び出しを実行しようとすると、呼び出しは失敗します。すべての ajax 呼び出しでパラメーターをThe provided anti-forgery token was meant for a different claims-based user than the current user.
送信しているにもかかわらず、' ' エラー。__RequestVerificationToken
ただし、ユーザーがリンクをクリックして別のページを開いたり、現在のページを再読み込み/更新したりすると、後続のすべての ajax 呼び出しが正常に完了します。
私たちの理解では、UserMigrationAttribute は OnActionExecuting メソッドでユーザーを作成しますが、プロセス @Html.AntiForgeryToken() のユーザーにサインインした後、正しい値で更新されていません。
以下の UserMigrationAttribute コードを見つけることができます。
[AttributeUsage(AttributeTargets.Class)]
public class UserMigrationAttribute : ActionFilterAttribute
{
public ApplicationSignInManager SignInManager(ActionExecutingContext filterContext)
{
return filterContext.HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
public UserManager UserManager(ActionExecutingContext filterContext)
{
return filterContext.HttpContext.GetOwinContext().GetUserManager<UserManager>();
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
CreateMigrateCurrentUser(filterContext);
base.OnActionExecuting(filterContext);
}
private static readonly object LockThis = new object();
private void CreateMigrateCurrentUser(ActionExecutingContext filterContext)
{
lock (LockThis)
{
var signInManager = SignInManager(filterContext);
var userManager = UserManager(filterContext);
var sessionTrackId = GetSessionTrackId(filterContext);
if (!filterContext.HttpContext.Request.IsAuthenticated)
{
if (!string.IsNullOrEmpty(sessionTrackId))
{
var username = string.Format("{0}@mydomain.com", sessionTrackId);
var user = userManager.FindByName(username);
if (user == null)
{
user = new User() {UserName = username, Email = username};
var result = userManager.Create(user);
userManager.AddToRole(user.Id, StringResources.AnonymousVisitorsGroup);
}
signInManager.SignIn(user, true, true);
}
}
else
{
if (!string.IsNullOrEmpty(sessionTrackId))
{
var username = string.Format("{0}@mydomain.com", sessionTrackId);
var user = userManager.FindByName(username);
if (user != null)
{
if (!HttpContext.Current.User.IsInRole(StringResources.AnonymousVisitorsGroup))
{
var targetUserId = HttpContext.Current.User.Identity.GetUserId<int>();
var service = new Service();
service.Users.MigrateUser(user.Id, targetUserId);
}
}
}
}
}
}
private string GetSessionTrackId(ActionExecutingContext filterContext)
{
var retVal = string.Empty;
if (filterContext.HttpContext.Request.Cookies["stid"] != null)
{
retVal = filterContext.HttpContext.Request.Cookies["stid"].Value;
}
return retVal;
}
}
ヘルプや提案は大歓迎です。
ありがとうございました、