2013-10-29 11 views
12

अनदेखी मैं एक CustomApiAuthorizeAttribute है:कस्टम एपीआई अधिकृत AllowAnonymous

public class CustomApiAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (actionContext == null) 
      throw new ArgumentNullException("actionContext"); 

     bool skipAuthorization = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any() || 
      actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any(); 

     if (skipAuthorization) return; 

     var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 

     if (cookie != null) 
     { 
      var decCookie = FormsAuthentication.Decrypt(cookie.Value); 

      if (decCookie != null) 
      { 
       if (!string.IsNullOrEmpty(decCookie.UserData)) 
       { 
        HttpContext.Current.User = new CustomPrinciple(new CustomIdentity(decCookie)); 
        return; 
       } 
      } 
     } 

     HttpContext.Current.Items["RequestWasNotAuthorized"] = true; 

     HttpContext.Current.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName) { Expires = DateTime.Now.AddDays(-1d) }); 

     HandleUnauthorizedRequest(actionContext); 
    } 
} 

और मैं एक नियंत्रक है:

[CustomApiAuthorize] 
public class RacingController : CustomApiController 
{ 
    [HttpGet] 
    [AllowAnonymous] 
    public Venues Venues() 
    { 
     var asr = Services.GetVenues(Token); 
     if(!string.IsNullOrEmpty(Token)) 
      SetAuthTicket(asr.Token); 
     return asr.Payload; 
    } 
} 

जब इस कार्रवाई फोन करने की कोशिश कर रहा एक 401 अनधिकृत त्रुटि प्राप्त हो रही। डिबगिंग मुझे बताता है कि Authorizeattribute [AllowAnonymous] की उपस्थिति का पता नहीं लगा रहा है लेकिन मुझे समझ में नहीं आता क्यों।

क्या कोई भी देख सकता है कि मैं क्या गलत कर रहा हूं? या कोई विचार है कि कुछ और विरोधाभासी हो सकता है?

+2

दो अनुमति दें अनाम गुण, सिस्टम.Web.Mvc में से एक और System.Web.Http में से एक - क्या आपने सत्यापित किया है कि आपके कोड में दो संदर्भ एक ही हैं? – stames

उत्तर

13

आप System.Web.Http.AuthorizeAttribute के स्रोत में देखें, तो वहाँ निम्नलिखित जांच है देखने के लिए अगर प्राधिकरण को छोड़ दिया जाना चाहिए:

public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (actionContext == null) 
     { 
      throw Error.ArgumentNull("actionContext"); 
     } 

     if (SkipAuthorization(actionContext)) 
     { 
      return; 
     } 

     if (!IsAuthorized(actionContext)) 
     { 
      HandleUnauthorizedRequest(actionContext); 
     } 
    } 

     private static bool SkipAuthorization(HttpActionContext actionContext) 
    { 
     Contract.Assert(actionContext != null); 

     return actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any() 
       || actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any(); 
    } 

तो क्या मैंने किया था के भीतर एक समान की जांच को लागू मेरे कस्टम प्राधिकरण विशेषताओं।

+1

यह कामकाज पूरी तरह से काम करता है। धन्यवाद! – Ezequiel

संबंधित मुद्दे