2012-01-26 1 views
0

내 질문은이 문제와 매우 유사합니다. AntiForgery Exception: A required anti-forgery token was not supplied or was invalid 하지만 MVC3이 있고 면도기를 사용하고 있습니다.오류가 발생할 수있는 오류 : 필요한 위조 토큰이 제공되지 않았거나 유효하지 않았습니다.

제어기는

[ValidateAntiForgeryToken] 

는 또한 I 관찰 @Html.AntiForgeryToken()

사용 <input name="__RequestVerificationToken"...를 인쇄 HTML에서

지정 갖는다 I는 브라우저 인증 쿠키 및 제어기 수단을 삭제 경우 does not have [Authorize]나는 AntiForery에 문제가 없습니다. 왜?

+2

은 제출하는 각 양식의'@ Html.AntiForgeryToken()'입니까? 아니면 그냥 어딘가에 페이지에 떠 다니고 있습니까? –

+0

마크가 정확합니다. AntiForgeryToken 도우미가 Form 태그 안에 있는지 확인하십시오. 표준 요청입니까 아니면 Ajax 요청입니까? – mtm927

답변

0

쿠키를 확인하고 requestVerificationToken 쿠키가 올바르게 설정되어 있는지 확인하십시오. 사이트의 쿠키가 모두 SSL로 설정되어 있고 일반 HTTP를 통해 로컬로 실행하려고했기 때문에 쿠키가 승인되지 않았기 때문에 안전하지 않은 채널을 통해 전송되었습니다.

나를 위해, 이것은 system.web/httpCookies 아래의 web.config에서 requireSSL = "false"로 변경하는 것을 의미합니다 ... 그러나 이것이 당신이보고있는 것과 다르다면 나는 여전히 시스템에서 쿠키를 망칠 수 있습니다 (예 : 세션 재설정, 어딘가에서 쿠키를 수동으로 지우는 것 등). 컨트롤러 메소드에 유효성 검사 속성이 올바르게 있고 여전히 이것을 얻고 있다면, 그 쿠키를 수정하거나 제거하는 것이 원인 일 것입니다!

편집 : 또한 POST 메서드 대신 컨트롤러에이 작업을 수행하면 그 이유는 ...이 작업은 서버에 대한 POST 양식에만 적용됩니다.

/// <summary> 
/// Custom Implementation of the Validate Anti Forgery Token Attribute. 
/// </summary> 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class CustomValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    /// <summary> 
    /// The ValidateAntiForgeryTokenAttribute. 
    /// </summary> 
    private readonly ValidateAntiForgeryTokenAttribute _validator; 

    /// <summary> 
    /// The AcceptVerbsAttribute. 
    /// </summary> 
    private readonly AcceptVerbsAttribute _verbs; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="CustomValidateAntiForgeryTokenAttribute"/> class. 
    /// </summary> 
    /// <param name="verbs">The verbs.</param> 
    public CustomValidateAntiForgeryTokenAttribute(HttpVerbs verbs) : this(verbs, null) 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="CustomValidateAntiForgeryTokenAttribute"/> class. 
    /// </summary> 
    /// <param name="verbs">The verbs.</param> 
    /// <param name="salt">The salt.</param> 
    public CustomValidateAntiForgeryTokenAttribute(HttpVerbs verbs, string salt) 
    { 
     _verbs = new AcceptVerbsAttribute(verbs); 
     _validator = new ValidateAntiForgeryTokenAttribute 
         { 
          Salt = salt 
         }; 
    } 

    /// <summary> 
    /// Called when authorization is required. 
    /// </summary> 
    /// <param name="filterContext">The filter context.</param> 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride(); 

     var found = false; 
     foreach (var verb in _verbs.Verbs) 
     { 
      if (verb.Equals(httpMethodOverride, StringComparison.OrdinalIgnoreCase)) 
      { 
       found = true; 
      } 
     } 

     if (found && !filterContext.RequestContext.RouteData.Values["action"].ToString().StartsWith("Json")) 
     { 
      _validator.OnAuthorization(filterContext); 
     } 
    } 
} 

그럼 당신은 단지 모든 컨트롤러에 다음을 추가, 또는베이스 수 있습니다 여기에

는 자동으로 모든 POST 작업 방법에 대한 유효성을 검사 형태에 적용 할 수있는 간단한 사용자 정의 버전입니다 컨트롤러를 무시하고 상속 한 경우 :

[CustomValidateAntiForgeryToken(HttpVerbs.Post)] 
0

위조 방지 토큰은 사용자 신원과 관련됩니다. 토큰을 생성하고 유효성을 검사하는 사이에 현재 로그인 한 사용자 ID를 변경하면 토큰이 성공적으로 유효성이 검사되지 않습니다. 또한 익명 모드로 모든 것이 작동하는 이유를 설명합니다.

관련 문제