ASP.NET Core 3.1 में MVC से एंडपॉइंट रूटिंग में माइग्रेट करते समय रोल्स के साथ अधिकृत नहीं काम करना

Nov 26 2020

मैं अपने प्रोजेक्ट को अपग्रेड करने की कोशिश कर रहा हूं ।UseMVC (asp.net core 2.2 कंपोजिट स्टाइल) से .UseEndpoint रूटिंग और मैं अपने सभी अनुरोधों के लिए अपने suthentication विफल पेज पर फिर से निर्देशित हो रहा हूं। यह दावों के साथ करना है - अगर मैं [अधिकृत (भूमिका = "व्यवस्थापक")] के भूमिका भाग को केवल [अधिकृत] कर दूं तो यह काम करता है। ऐसा लगता है कि यह उन दावों को नहीं उठा रहा है जो उपयोगकर्ता को सौंपे गए हैं।

यह ASP.NET कोर 3.1 में समापन बिंदु रूटिंग के साथ काम नहीं कर रहा प्राधिकरण के रूप में एक बहुत ही समान मुद्दा लगता है

निम्नलिखित पैराग्राफ लिंक्ड पोस्ट से एक अंश है, लेकिन मुद्दे के मेरे संस्करण को प्रतिबिंबित करने के लिए संशोधित किया गया है

2.2 में सब कुछ ठीक रहा, लेकिन 3.1 में माइग्रेट होने और एंडपॉइंट रूटिंग को सक्षम करने के बाद, यह नियंत्रक किसी भी समापन बिंदु के अनुरोधों को अस्वीकार करना शुरू कर देता है जब [अधिकृत (रोल्स = "एडमिन")] विशेषता मौजूद होती है। जब मैं "रोल्स =" भाग को हटाता हूं और उपयोगकर्ता को देखता हूं। मुझे लगता है कि मैं देख सकता हूं कि इसमें आवश्यक दावे / भूमिकाएं हैं। यह केवल तभी होता है जब Endpoint रूटिंग को सक्षम किया जाता है, UseMvc का उपयोग करने के मामले में सब कुछ ठीक से काम करता है। एंडपॉइंट रूटिंग मोड में प्राधिकरण के साथ क्या गलत है?

Excerpt from Startup.cs

 app.UseSession();
    
 app.UseRouting();
    
 app.UseAuthentication();
 app.UseAuthorization();
 app.UseResponseCompression();
 //Add the users Roles as claims to his identity so that it is picked up for authentication purposes
 app.Use((context, next) =>
 {
     var userId = context.User.Identity.Name;
     if (userId == null)
     {
         return next();
     }
    
     ...
        
     var roles = resourceDataAccess.GetRolesForUser(userId);
     if (roles != null)
     {
         var claims = roles.Select(role => new Claim(ClaimTypes.Role, role.RoleEnum.ToString())).ToList();
    
         var appIdentity = new ClaimsIdentity(claims);
         context.User.AddIdentity(appIdentity);
     }
    
     return next();
 });
 app.UseEndpoints(endpoints =>
 {
     endpoints.MapHub<AppHub>("api/apphub");
     endpoints.MapControllerRoute("default", "api/{controller=Account}/{action=SignIn}/{id?}");
     endpoints.MapControllerRoute("catch-all", "api/{*url}",
             new {controller = "Utility", action = "NotFoundPage"});
 });

जवाब

2 akraines Nov 29 2020 at 16:00

It turns out since we were using app.Use() middleware to fill in the user's roles from the DB, it needed to be called before UseAuthorisation so that the roles were loaded before authorisation was performed. (Like @CamiloTerevinto's comment)

 app.UseSession();
    
 app.UseRouting();
    
 app.UseAuthentication();
 //Add the users Roles as claims to his identity so that it is picked up for authentication purposes
 app.Use((context, next) =>
 {
   ...
 }
 //Setup the authorisation middleware to run only after we have loaded the users roles.
 app.UseAuthorization();
 app.UseResponseCompression();