7

से वर्णनात्मक 401 संदेश लौट रहा है मेरे पास ओविन का उपयोग कर एएसपीनेट 4.5 वेब एपीआई चल रहा है। जब भी एक अनाधिकृत अनुरोध किए जाने पर यह निम्नलिखित प्रतिक्रिया के साथ एक 401 रिटर्न की उम्मीद के रूप में:ओविन WebApi2

{"Message":"Authorization has been denied for this request."} 

मैं यह प्रतिक्रिया (सीमा समाप्त टोकन, अमान्य भूमिका, आदि ...) के लिए अतिरिक्त विस्तार जोड़ना चाहते हैं और एक कस्टम कार्यान्वित [AuthorizeAttribute] इस SO post पर आधारित है।

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     var response = actionContext.Request.CreateResponse<MyError> 
      (new MyError() { Description = "This is why you're unauthorized" }); 
     response.StatusCode = HttpStatusCode.Unauthorized; 
     actionContext.Response = response; 
    } 
} 

और फिर मेरी नियंत्रकों पर यह प्रयोग किया जाता इस तरह:

[MyAuthorizeAttribute(Roles = "Foo")] 
public class MyController : ApiController 
{ 
    ... 
} 

जो निम्नलिखित प्रतिक्रिया की उम्मीद के रूप में के साथ एक 401 देता है:

{"Description": "This is why you're unauthorized"} 

हालांकि, मैं नहीं दिख रहा है कि कैसे करने के लिए HttpActionContext से MyAuthorizeAttribute.HandleUnauthorizedRequest पर अनुरोध अनधिकृत होने का कारण निर्धारित करें। उदाहरण के लिए, जब मैं स्थानीय रूप से डिबगिंग कर रहा हूं और एक समाप्त टोकन के साथ अनुरोध करता हूं तो यह SecurityTokenExpiredExceptionIDX10223: Lifetime validation failed. The token is expired. ValidTo: '...' Current time: '...'. समझाता है या अमान्य श्रोताओं के साथ SecurityTokenInvalidAudienceExceptionMessage=IDX10214: Audience validation failed. Audiences: '...'. Did not match: validationParameters.ValidAudience: 'null' or validationParameters.ValidAudiences: '...'. समझाता है मैंने अपने Startup.cs में कई ब्रेकपॉइंट सेट किए हैं, फिर भी पकड़ने में असमर्थ रहे हैं इन अपवादों में से एक को फेंकने से पहले।

ओविन मिडलवेयर का उपयोग करके अनुरोध अनधिकृत होने का विशिष्ट कारण कैसे निर्धारित कर सकता हूं?

उत्तर

0

पता नहीं लगा कि समाप्ति और न ही अमान्य ऑडियंस और इस तरह की पहचान कैसे करें, लेकिन मैंने इसे कम से कम 403 एस भूमिकाओं के आधार पर वापस करने के लिए इसका उपयोग समाप्त कर दिया।

ऊपर दिए गए मेरे प्रश्न में उदाहरण का उपयोग करके आप संदेश को कस्टमाइज़ कर सकते हैं ("आपके पास इस क्रिया तक पहुंचने के लिए रोल एक्स होना चाहिए ...")।

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     base.HandleUnauthorizedRequest(actionContext); 

     if (actionContext.RequestContext.Principal != null && 
      actionContext.RequestContext.Principal.Identity.IsAuthenticated && 
      Roles != null) 
     { 
      if (!Roles.Split(',').Any(x => 
       actionContext.RequestContext.Principal.IsInRole(x.Trim()))) 
      { 
       actionContext.Response.StatusCode = HttpStatusCode.Forbidden; 
      } 
     } 
    } 
} 
+0

हे @ ग्रेग ओवेन का उपयोग करके इसे संभालने का कोई मौका अभी तक? –

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