일례 로그인 검증으로 인한 위조 방지 표시는 현재 사용자의 문제에 적용되지 않고 성명 기반 다른 사용자에게 적용됩니다

5109 단어 asp.netMVC
최근에 버그 로그 교육 경력 추가 과정에서 제공된 위조 방지 표시가 현재 사용자의 오류에 적용되지 않고 성명 기반의 다른 사용자에게 적용되는 것을 발견했다.테스트를 통해 정상적인 상황에서는 이 오류가 발생하지 않을 것이다.교육 경력을 추가할 때만 다른 열린 창에서 로그인을 종료해야 문제가 발생합니다.
나는 컨트롤러에서 구직 로그인 검사를 실현했다.
4
[PersonLoginCheckFilterAttribute(IsCheck = true)]
그리고 교육 교육의 action 방법에서 이루어진 것은 다음과 같다.
[ValidateAntiForgeryToken]      。

나의 구직 검증 클래스는 이렇게 썼다.
/// 
    ///          
    /// 
    public class PersonLoginCheckFilterAttribute : ActionFilterAttribute
    {

        /// 
        ///         
        /// 
        public bool IsCheck { get; set; }

        /// 
        /// Action           ,         
        /// 
        /// 
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (IsCheck)
            {

                //          
                if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                {
                    //      
                    filterContext.Result = new RedirectResult("~/account/login", true);
                    //return;

                }
                var user = new LMIdentityDbContext().Users.Find(filterContext.HttpContext.User.Identity.GetUserId());
                if (user == null || user.Role != "person")
                {
                    //      
                    filterContext.Result = new RedirectResult("~/account/login", true);
                    //return;
                }

            }
            base.OnActionExecuting(filterContext);


        }
    }

ActionFilterAttribute를 계승했기 때문에, 나는 ActionFilterAttribute가 실현한 것이 IACtionFilter,IresultFilter 인터페이스라는 것을 안다.
Validate AntiForgeryToken 방법은 제가 역번역을 통해 실현된 인터페이스가IAuthorizationFilter라는 것을 보았습니다.
 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple =false, Inherited = true)]     public sealed class ValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
우리는 모두 mvc의 필터가 네 가지가 있다는 것을 안다.Authorization(라이센스), Action(비헤이비어), Result(결과), Exception(이상)입니다.이상은 말할 것도 없고, 실행 순서는 먼저 Authorization, 나중에 Action, 마지막에 Result입니다.상식적으로 절차는 다음과 같아야 한다. 교육 경력을 추가할 때 로그인 여부를 판단하고 로그인하지 않으면 로그인 페이지로 이동하고 로그인이 있으면 교육 경력을 추가한 action에서Validate AntiForgeryToken을 검증한다.여기에 직접 제공한 위조 방지 표시는 다른 성명을 바탕으로 하는 사용자에게 적용되고 현재 사용자의 오류에 적용되지 않는다. 내 로그인 검증이 계승된 Action Filter가Validate AntiForgery Token이 실현한 인터페이스인 IAuthorization Filter보다 늦게 실행되어 이 오류를 초래한 것으로 추정된다.따라서 이 로그인 인증 방법을 수정하고 Authorize Attribute 방법을 계승하여 문제를 해결할 수 있는지 확인하기로 결정했습니다.수정된 코드는 다음과 같습니다.
/// 
    ///          
    /// 
    public class PersonLoginCheckFilterAttribute : AuthorizeAttribute
    {

        /// 
        ///         
        /// 
        public bool IsCheck { get; set; }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool hasRole = base.AuthorizeCore(httpContext);

            //    ,       , false
            //EventLog.WriteLog("hasRole1:" + hasRole.ToString());
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }

            return hasRole;
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            if (IsCheck)
            {
                if (filterContext.HttpContext.User == null)
                {
                    return;
                }
                if (filterContext.HttpContext.User.Identity == null)
                {
                    return;
                }

                //          
                if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                {
                    //      
                    filterContext.Result = new RedirectResult("~/account/login", true);
                    return;

                }
                var user = new LMIdentityDbContext().Users.Find(filterContext.HttpContext.User.Identity.GetUserId());
                if (user == null || user.Role != "person")
                {
                    //      
                    filterContext.Result = new RedirectResult("~/account/login", true);
                    return;
                }

            }

            base.OnAuthorization(filterContext);

        }



        /// 
        ///      
        /// 
        /// 
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {

            base.HandleUnauthorizedRequest(filterContext);


        }
    }

수정 후 테스트를 진행합니다.교육 경력 추가 페이지를 열고 자료를 기입한 다음에 교육 경력 페이지를 열고 이 페이지에서 로그인을 종료합니다. 이때 자료를 제출하면 자동으로 로그인 페이지로 넘어갑니다. 위조 방지 표시가 다른 성명 기반 사용자에게 적용되지 않고 현재 사용자의 잘못된 알림에 적용되지 않습니다.문제 해결

좋은 웹페이지 즐겨찾기