2015-05-17 11 views
6

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

मेरा प्रश्न है: प्रमाणीकरण पूर्ण होने के बाद रोलर्स को सर्विसयूसर का दावा कैसे किया जाता है लेकिन प्राधिकरण फ़िल्टर की ऑनअधिकृत विधि से पहले चलता है? क्या यह भी संभव है?

मुझे क्या करना चाहते हैं का उदाहरण:

[Authorize(Roles = "admin")] 
public async Task<IHttpActionResult> Put(int id, MyDto dto){...} 

असहज तालिका उदाहरण:

Roles 
id | name 
1 | user 
2 | admin 

UserProfiles 
id | externalLoginId   | favoriteColor 
1 | Google:<ServiceUser.Id> | blue 

UserRoles (Linking Table) 
roleId | userId 
2  | 1 

संपादित करें:

एक विकल्प अपने ही कार्रवाई फिल्टर अधिकृत फिल्टर अधिभावी बनाने के लिए हो सकता है विशेषता और ऑनअधिकृत विधि में मैं वर्तमान उपयोगकर्ता के लिए भूमिका प्राप्त करने के लिए UserProfiles और Roles टेबल से पूछताछ कर सकता हूं, फिर प्राधिकृत में निर्दिष्ट भूमिकाओं के विरुद्ध जांचें ऑब्जेक्ट की भूमिका संपत्ति यह निर्धारित करने के लिए कि उपयोगकर्ता के पास पहुंच है या नहीं। लेकिन किसी भी तरह, ऐसा लगता है कि पाइपलाइन में पहले एक जगह होनी चाहिए जिसे मैं वर्तमान उपयोगकर्ता को भूमिकाओं के दावों को जोड़ने के लिए रोक सकता हूं।

+0

यह मुझे कल पूरे दिन ले लिया है, लेकिन मैं अंत में समाधान पर पहुंचे नीचे। मैंने कस्टम ओविन मिडलवेयर से कस्टम लॉगिनप्रोवाइडर्स तक सब कुछ करने की कोशिश की और मुझे कोई भी नहीं मिला जो मैं चाहता था। मैं अपना खुद का कस्टम प्राधिकरण एट्रिब्यूट बना सकता था, लेकिन मैंने सोचा था कि पाइपलाइन में पहले एक जगह होनी चाहिए जहां मैं केवल भूमिका दावों को जोड़ सकता हूं और केवल सामान्य AuthorizeAttribute [प्राधिकरण (भूमिकाएं = "उपयोगकर्ता, व्यवस्थापक")]। नीचे दिया गया समाधान उस लक्ष्य को पूरा करता है। लेकिन अब मैं माइक्रोसॉफ्ट के आंतरिक कामकाज के बारे में और अधिक जानता हूं। WindowsAzure। * असेंबली जो मैं कभी चाहता था। :) –

उत्तर

4

मुझे समाधान मिला। यह शामिल है:

  1. मेरे अपने ServiceTokenHandler बनाना और CreateServiceUser मेरी UserProfile तालिका में भूमिकाओं में निर्दिष्ट उपयोगकर्ता से जुड़े होते हैं खोजने की कोशिश करता है कि base.CreateServiceUser (claimsIdentity) करने के लिए कॉल के बाद तर्क जोड़ने के लिए विधि अधिभावी दावेदारी। यदि इसे भूमिकाएं मिलती हैं, तो यह दावाों के दावों के संग्रह में नए रोल दावों को जोड़ती है।

    public class RolesServiceTokenHandler : ServiceTokenHandler 
    { 
        public RolesServiceTokenHandler(HttpConfiguration config) : base(config) 
        { 
    
        } 
    
        public override ServiceUser CreateServiceUser(ClaimsIdentity claimsIdentity) 
        { 
         var serviceUser = base.CreateServiceUser(claimsIdentity); 
    
         if (serviceUser != null && serviceUser.Identity.IsAuthenticated) 
         { 
          var dataContext = new AllergenDerivativesContext(); 
          var userId = serviceUser.Id; 
          var userProfile = dataContext.UserProfiles.Include(u => u.Roles).FirstOrDefault(u => u.ExternalUserId == userId); 
    
          if (userProfile == null) 
          { 
           //If the user profile does not exist, then create it and assign it to the User role by default. 
           userProfile = new UserProfile(); 
    
           //Set the ExternalUserId for the UserProfile to the current User's External Login Id. 
           userProfile.ExternalUserId = userId; 
    
           //Get the "User" Role Entity. 
           var userRole = dataContext.Roles.FirstOrDefault(r => r.Name == Roles.User); 
    
           //Initialize the roles collection for the new UserProfile 
           //And add the existing role to the collection. 
           userProfile.Roles = new List<Role> { userRole }; 
    
           //Add the new UserProfile to the database and save the changes. 
           dataContext.UserProfiles.Add(userProfile); 
           dataContext.SaveChanges(); 
          } 
    
          //Get the roles for the UserProfile and add role claims to the ServiceUser's primary Identity. 
          foreach (var role in userProfile.Roles) 
          { 
           ((ClaimsIdentity)serviceUser.Identity).AddClaim(new Claim(ClaimTypes.Role, role.Name)); 
          } 
         } 
    
         return serviceUser; 
        } 
    } 
    
  2. इतनी है कि जब अनुप्रयोग एक IServiceTokenHandler अनुरोध करता है, autofac नई RolesServiceTokenHandler रिटर्न IServiceTokenHandler रूप autofac के साथ नए RolesServiceTokenHandler रजिस्टर।

WebApiConfig.cs फ़ाइल के स्थिर रजिस्टर विधि के अंदर, ServiceConfig.Initialize करने के लिए कॉल को बदलते हैं ताकि ऐसा लगता है कि:

HttpConfiguration config = ServiceConfig.Initialize(new ConfigBuilder(options, (httpConfig, autofac) => 
      { 
       autofac.RegisterType<RolesServiceTokenHandler>().As<IServiceTokenHandler>(); 
      })); 
1

आप की तरह कुछ के साथ, उपयोगकर्ता प्रधानाचार्य को भूमिका दावा जोड़ सकते हैं:

new ClaimsIdentity(new Claim[] 
{ 
    new Claim(ClaimTypes.NameIdentifier, loginName), 
    new Claim(ClaimTypes.Role, "admin"), 
}; 

लेकिन तब तुम सिर्फ दावों जानकारी है कि भूमिका आधारित प्राधिकरण प्रदान करने के लिए में हो जाता है मान्य पर भरोसा करेंगे?

आपको अपनी विधियों को सजाने के लिए AuthorizeLevelAttribute, या इसके बजाय कुछ अन्य कस्टम विशेषता के माध्यम से प्राधिकरण और सत्यापन को संभालने की आवश्यकता है; और आपको उस व्यवहार को प्रोग्राम करने की आवश्यकता है जिसे उपयोगकर्ता की भूमिका को प्रमाणित करने के लिए आवश्यक होना चाहिए। पर प्राधिकरण विधि ओवरराइड में भूमिका सदस्यता को सत्यापित करने के बाद, और यह आपके ऊपर निर्भर करता है: आप अपने डीबी, ग्राफ एपीआई या अन्य प्रश्न पूछ सकते हैं। मुझे नहीं लगता कि वहाँ इस पल में, कर रहे हैं, के प्रबंधन प्राधिकरण के अन्य विकल्प, और प्रलेखन और नमूने इस तरह

यहाँ कुछ अच्छे संदर्भ में भी बात:

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