ValidateAntiForgeryTokenの代わりに自作フィルタを用いてaspを解決する.Netmvc提供された偽造防止タグは、現在のユーザーのエラーではなく、他の宣言ベースのユーザーに適用されます.
以前aspを書いたことがあります.Netmvcは、現在のユーザエラーの処理に適用されない他の宣言ベースのユーザに適用される偽造防止タグについて、そのブログの最後に残念な思いを残した.そのブログでカスタマイズされたフィルタはactionで2回呼び出す必要があり、提供された偽造防止タグが他の宣言ベースのユーザに適用され、現在のユーザのようなエラープロンプトに適用されないことを避けることができる.呼び出されたコードは次のとおりです.
LoginAuthorizeがactionで2回呼び出されていることがわかります.だからこれから暇があれば自分でValidateAntiForgeryTokenを書いてこの問題を徹底的に解決するつもりです.ここ数日ちょうど空いているので、この問題を解決しようとしています.複雑だと思っていたが、なかなか解決できなかった.しかし、実際にやっている過程では簡単です.ValidateAntiForgeryTokenの代わりにカスタムフィルタを使用するのは、想像していたほど難しくありません.実装されるコードは次のとおりです.
呼び出し方法:
フロントのcshtmlではまだ使用されています
何も変わらない
[HttpPost]
[AllowAnonymous]
[LoginAuthorize]
[ValidateAntiForgeryToken]
[LoginAuthorize]
public async Task Login(LoginViewModel model, string returnUrl)
LoginAuthorizeがactionで2回呼び出されていることがわかります.だからこれから暇があれば自分でValidateAntiForgeryTokenを書いてこの問題を徹底的に解決するつもりです.ここ数日ちょうど空いているので、この問題を解決しようとしています.複雑だと思っていたが、なかなか解決できなかった.しかし、実際にやっている過程では簡単です.ValidateAntiForgeryTokenの代わりにカスタムフィルタを使用するのは、想像していたほど難しくありません.実装されるコードは次のとおりです.
///
/// AntiForgeryToken
///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CustomerValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
internal Action ValidateAction
{
get;
private set;
}
public CustomerValidateAntiForgeryTokenAttribute() : this(new Action(AntiForgery.Validate))
{
}
internal CustomerValidateAntiForgeryTokenAttribute(Action validateAction)
{
this.ValidateAction = validateAction;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
try
{
this.ValidateAction();
}
catch (Exception ex)
{
EventLog.WriteLog(ExceptionHelper.GetErrorMessageByLog(ex));
//string url = filterContext.HttpContext.Request.UrlReferrer.ToString();
//EventLog.WriteLog(url);
filterContext.Result = new RedirectResult("/account/login", true);
return;
//throw;
}
}
呼び出し方法:
[HttpPost]
[AllowAnonymous]
//[LoginAuthorize]
[SXF.Utils.MVC.CustomerValidateAntiForgeryToken]
//[LoginAuthorize]
public async Task Login(LoginViewModel model, string returnUrl)
フロントのcshtmlではまだ使用されています
@Html.AntiForgeryToken()
何も変わらない