2017-08-15 18 views
15

मैं एक एपीआई के साथ एक वेबसाइट बना रहा हूं, एपीआई को सत्यापन की आवश्यकता है ताकि उपयोगकर्ता को केवल अपना डेटा प्राप्त हो। मैंने लॉगिन को सत्यापित करने के लिए निम्न मध्यवर्ती लिखा है।। नेट-कोर मिडलवेयर रिटर्न रिक्त परिणाम

public class ApiAuthenticationMiddleware 
{ 
    private readonly RequestDelegate _next; 
    private readonly UserManager<ApplicationUser> _userManager; 
    private readonly SignInManager<ApplicationUser> _signInManager; 

    public ApiAuthenticationMiddleware(RequestDelegate next, 
     SignInManager<ApplicationUser> signInManager, 
     UserManager<ApplicationUser> usermanager) 
    { 
     _next = next; 
     _signInManager = signInManager; 
     _userManager = usermanager; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     if (!context.Request.Query.ContainsKey("password") || !context.Request.Query.ContainsKey("email")) 
     { 
      context.Response.StatusCode = 401; //UnAuthorized 
      await context.Response.WriteAsync("Invalid User Key"); 
      return; 
     } 
     var email = context.Request.Query["email"]; 
     var password = context.Request.Query["password"]; 

     var result = await _signInManager.PasswordSignInAsync(email, password, false, lockoutOnFailure: false); 
     if (result.Succeeded) 
     { 
      await _next.Invoke(context); 
     } 
     else if (//some more checks) 
      context.Response.StatusCode = 401; //UnAuthorized 
      await context.Response.WriteAsync("Invalid User Key"); 
      return; 
     } 
    } 
} 

क्या मैं चाहते हैं तो उपयोगकर्ता कोई वैध प्रवेश किया है कि एक रिक्त पृष्ठ या की तरह "अमान्य उपयोगकर्ता कुंजी" एक त्रुटि संदेश दिखाई जाती है। हालांकि इस समय क्या होता है होम पेज लौटाया जाता है (क्योंकि मेरा मिडलवेयर usemvc से पहले कहा जाता है और रिटर्न स्टेटमेंट usemvc द्वारा किए गए नियंत्रक अनुरोध को छोड़ देता है)।

startup.cs में कॉन्फ़िगर विधि में मेरे प्रासंगिक कोड

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 

     app.UseIdentity(); 
     app.UseWhen(x => (x.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase)), 
      builder => 
      { 
       builder.UseMiddleware<ApiAuthenticationMiddleware>(); 
      }); 
     app.UseStaticFiles(); 
     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 

मैं अपने मिडलवेयर स्थिति कोड के साथ एक रिक्त पृष्ठ वापसी कर सकते हैं?

कृपया डाउनवॉटिंग के कारण को समझाएं ताकि मैं प्रश्न सुधार सकूं और जान सकूं कि मैंने क्या गलत किया है।

अद्यतन

चीजों की बहुत कोशिश के बाद मैंने पाया कि जब मैं निकालें:

await context.Response.WriteAsync("Invalid User Key"); 
:

context.Response.StatusCode = 401; //UnAuthorized 

यह काम करता है के रूप में उम्मीद, उपयोगकर्ता संदेश में दिए गए हो जाता है

हाउवर मैं नहीं चाहता कि उपयोगकर्ता लॉग ऑन पर 200 स्टेटसोड प्राप्त करे, लेकिन 401 स्टेटसोडोड विफल हो। लेकिन स्थिति कोड लाइन का उपयोग करते समय उपयोगकर्ता को पुनर्निर्देशित किया जाता है। तो मैं पुनर्निर्देशन के बिना स्टेटसोड कैसे भेज सकता हूं?

+0

क्यों उपयोग नहीं कर 'Authorize' विशेषता – CodeNotFound

+0

अधिकृत मान लिया गया एक उपयोगकर्ता इम एक मोबाइल एप्लिकेशन के लिए एक API बनाने इसलिए ऐप्स जो मान्य उपयोगकर्ता से होने की जरूरत है अनुरोध भेजता में लॉग ऑन है (अगर im सही कुकी के माध्यम से)। यह भी अधिकृत है कि अगर रजिस्टर नहीं किया गया है तो रजिस्टर पेज पर रीडायरेक्ट किया जाएगा जो कि मेरे एपीआई के लिए इच्छित व्यवहार नहीं है। –

+0

मैं ओपनआईडी मिडलवेयर पर एक नज़र डालेगा। यह मिडलवेयर प्राधिकृत विशेषता –

उत्तर

4

मेरे पास एक झटका है कि app.UseIdentity() में डिफ़ॉल्ट व्यवहार है कि जब 403/401 होता है, तो यह प्रतिक्रिया को रोक देगा और रीडायरेक्ट शुरू करेगा। इसे टिप्पणी करने का प्रयास करें और देखें कि यह काम करता है या नहीं।

वैकल्पिक समाधान देखें: https://stackoverflow.com/a/43456151/3948882

अंतिम टिप्पणी: मैं दृढ़ता से प्रत्येक अनुरोध के लिए साख गुजर नहीं प्रोत्साहित करते हैं। मैं प्रीबिल्ट ऑथ प्रदाताओं का उपयोग करने की सलाह देता हूं और आपके मिडलवेयर के रूप में लागू करता हूं। अनुरोध किए गए अनुरोधों के लिए Authorize विशेषता पर्याप्त होनी चाहिए और जो भी आप खोज रहे हैं वह कर सकते हैं। यदि आप कुछ विशेष वापस करना चाहते हैं, तो आप app.UseIdentity() मिडलवेयर जैसे रीडायरेक्टिंग के साथ मिडलवेयर के साथ प्रतिक्रिया को ओवरराइड कर सकते हैं।

0

स्टेटस कोड सेट करने से पहले क्लीयर() का उपयोग करने का प्रयास करें।

  context.Response.Clear(); 
      context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
      await context.Response.WriteAsync("Unauthorized"); 
संबंधित मुद्दे