आप पूरी तरह से प्राप्त कर सकते हैं कि आप क्या चाहते हैं:
services
.AddAuthentication()
.AddJwtBearer("Firebase", options =>
{
options.Authority = "https://securetoken.google.com/my-firebase-project"
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "my-firebase-project"
ValidateAudience = true,
ValidAudience = "my-firebase-project"
ValidateLifetime = true
};
})
.AddJwtBearer("Custom", options =>
{
});
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
});
चलो अपने कोड और उस एक के बीच के अंतर से गुजरते हैं।
AddAuthentication कोई पैरामीटर नहीं है
यदि आप एक डिफ़ॉल्ट प्रमाणीकरण योजना सेट करते हैं, तो हर एक अनुरोध पर प्रमाणीकरण मिडलवेयर डिफ़ॉल्ट प्रमाणीकरण योजना से जुड़े प्रमाणीकरण हैंडलर को चलाने का प्रयास करेगा। चूँकि अब हमारे पास दो ओपेसिबल प्रमाणीकरण योजनाएँ हैं, इसलिए उनमें से एक को चलाने का कोई मतलब नहीं है।
का एक और अधिभार का उपयोग करें AddJwtBearer
AddXXXप्रमाणीकरण जोड़ने के लिए हर एक विधि में कई अतिभार होते हैं:
अब, क्योंकि आप एक ही प्रमाणीकरण विधि का दो बार उपयोग करते हैं, लेकिन प्रमाणीकरण योजनाएँ अद्वितीय होनी चाहिए, आपको दूसरे अधिभार का उपयोग करने की आवश्यकता है।
डिफ़ॉल्ट नीति को अपडेट करें
चूँकि अनुरोधों को स्वचालित रूप से प्रमाणित नहीं किया जाएगा, इसलिए [Authorize]कुछ कार्यों पर विशेषताएँ डालने से अनुरोध अस्वीकृत HTTP 401हो जाएंगे और जारी किए जाएंगे।
के बाद से वह नहीं है कि हम क्या चाहते हैं, क्योंकि हम प्रमाणीकरण संचालकों अनुरोध प्रमाणित करने के लिए एक मौका देना चाहते हैं, हम दोनों को दर्शाते हुए प्राधिकरण सिस्टम का डिफॉल्ट नीति में बदलाव Firebaseऔर Customप्रमाणीकरण स्कीम किया जाना चाहिए की कोशिश की अनुरोध प्रमाणित करने के लिए।
यह आपको कुछ कार्यों पर अधिक प्रतिबंध लगाने से नहीं रोकता है; [Authorize]विशेषता एक है AuthenticationSchemesसंपत्ति है कि आप ओवरराइड करने के लिए जो प्रमाणीकरण स्कीम मान्य हैं अनुमति देता है।
यदि आपके पास अधिक जटिल परिदृश्य हैं, तो आप नीति-आधारित प्राधिकरण का उपयोग कर सकते हैं । मुझे लगता है कि आधिकारिक दस्तावेज महान है।
आइए कल्पना करें कि कुछ क्रियाएं केवल JWT टोकन के लिए उपलब्ध हैं जो Firebase द्वारा जारी किए गए हैं और एक विशिष्ट मूल्य के साथ एक दावा होना चाहिए; आप इसे इस तरह से कर सकते हैं:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
फिर आप [Authorize(Policy = "FirebaseAdministrators")]कुछ कार्यों पर उपयोग कर सकते हैं ।
नोट करने के लिए एक अंतिम बिंदु: यदि आप AuthenticationFailedघटनाओं को पकड़ रहे हैं और कुछ भी लेकिन पहली AddJwtBearerनीति का उपयोग कर रहे हैं , तो आप यह देख सकते हैं कि IDX10501: Signature validation failed. Unable to match key...यह सिस्टम के कारण होता है AddJwtBearerजब तक कि यह मैच नहीं हो जाता। त्रुटि को आमतौर पर नजरअंदाज किया जा सकता है।