2015-05-13 8 views
11

को अस्वीकार करते समय OWIN/OAuth HTTP स्थिति कोड को अनुकूलित करें, मैंने दोनों क्लाइंट और संसाधन मालिकों को सत्यापित करने के लिए OAuthAuthorizationServerProvider व्युत्पन्न किया है।टोकन अनुरोध

जब मैं संसाधन मालिकों को मान्य मुझे लगता है अपने क्रेडेंशियल्स मान्य नहीं हैं, मैं context.Rejected(), फोन और जब तक मैं HTTP/401 अनधिकृत उम्मीद करेंगे HTTP प्रतिसाद HTTP/400 गलत अनुरोध स्थिति कोड के साथ आता है।

मैं OAuthAuthorizationServerProvider की प्रतिक्रिया HTTP स्थिति कोड कैसे अनुकूलित कर सकता हूं?

उत्तर

12

इस प्रकार हम ओविन मिडलवेयर को ओवरराइड करते हैं ... पहले हमने ओविन के शीर्ष पर अपना खुद का मिडलवेयर बनाया ... मुझे लगता है कि आपके जैसा ही था जैसा हमने किया था।

पहले एक निरंतर बनाने की आवश्यकता:

public class Constants 
{ 
    public const string OwinChallengeFlag = "X-Challenge"; 
} 

और हम ओवरराइड OwinMiddleware

public class AuthenticationMiddleware : OwinMiddleware 
{ 
    public AuthenticationMiddleware(OwinMiddleware next) : base(next) { } 

    public override async Task Invoke(IOwinContext context) 
    { 
     await Next.Invoke(context); 

     if (context.Response.StatusCode == 400 && context.Response.Headers.ContainsKey(Constants.OwinChallengeFlag)) 
     { 
      var headerValues = context.Response.Headers.GetValues(Constants.OwinChallengeFlag); 
      context.Response.StatusCode = Convert.ToInt16(headerValues.FirstOrDefault()); 
      context.Response.Headers.Remove(Constants.OwinChallengeFlag); 
     } 

    } 
} 

startup.Auth फ़ाइल में, हम आह्वान Owin की overrid अनुमति आदेश

public void ConfigureAuth(IAppBuilder app) 
    .... 
     app.Use<AuthenticationMiddleware>(); //Allows override of Invoke OWIN commands 
    .... 

    } 

और एप्लिकेशनऑथप्रोवाइडर में, हमने GrantResourceOwnerCredentials को संशोधित किया।

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     using (UserManager<IdentityUser> userManager = _userManagerFactory()) 
     { 
      IdentityUser user = await userManager.FindAsync(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       context.Response.Headers.Add(Constants.OwinChallengeFlag, new[] { ((int)HttpStatusCode.Unauthorized).ToString() }); //Little trick to get this to throw 401, refer to AuthenticationMiddleware for more 
       //return; 
      } 
      .... 
+0

मैं कल यह कोशिश करूंगा और अगर यह मेरे लिए काम करता है तो मैं आपको पुष्टि करूंगा !! अग्रिम धन्यवाद;) –

+0

अरे, मैंने आपके दृष्टिकोण की कोशिश की है और मुझे समस्याएं मिल रही हैं। मुझे लगता है कि 'STTIA प्रमाणीकरण Middleware' 'प्रमाणीकरण Middleware' है, और मेरा मुख्य मुद्दा यह है कि कस्टम पाइपलाइन को मेरी पाइपलाइन के दौरान कभी नहीं कहा जाता है। मैंने 'ed.Use ()' और 'app.Use (System.Type) का उपयोग करके अपना मिडलवेयर कॉन्फ़िगर किया है। क्या गलत है? –

+0

हां, पहले भाग पर, वे वही हैं। दूसरी तरफ, क्या आपने सत्यापित किया है कि startup.auth ConfigureAuth को कॉल कर रहा है और इसे सेट कर रहा है? –

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