2015-05-17 12 views
6

Tipik Authorize özniteliğiyle güven altına almak istediğim bazı denetleyicileri olan bir .NET Azure Mobile Services projem var. Bir Roles tablosu ve bir UserProfiles tablosu oluşturabilir ve Roles tablosundaki Rol'leri kullanarak Google, Facebook, vb. Aracılığıyla kimliği doğrulanmış çeşitli kullanıcıları ilişkilendirebilirim.Azure Mobile Services Kullanıcısı'na özel Roller Ekleme (Google, Twitter, Facebook, Microsoft)

Soruma: Doğrulama tamamlandıktan sonra Yetkilendirme filtresinin OnAuthorize yöntemi uygulanmadan önce Rolleri Hizmet Sağlayıcılara nasıl ekleyebiliriz? Bu mümkün mü?

yapmak istediğim şeyin

Örnek:

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

Kaba tablo örnekleri:

Roles 
id | name 
1 | user 
2 | admin 

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

UserRoles (Linking Table) 
roleId | userId 
2  | 1 

Düzenleme:

Seçeneklerden biri Yetki filtresi geçersiz kılma kendi eylem filtresi oluşturmak için olabilir özniteliği ve OnAuthorize yönteminde, geçerli kullanıcı için rol almak üzere UserProfiles ve Roles tablolarını sorgulayabilir, ardından Yetkilendirmede belirtilen rolleri kontrol edebilirim. Kullanıcının erişimi olup olmadığını belirlemek için nesnenin Rolleri özelliği. Ancak, bir şekilde, boru hattında, Rolleri taleplerini mevcut kullanıcıya eklemeyi engelleyebileceğim bir yer olması gerektiği düşüncesinde.

+0

ama sonunda çözüm geldi altında. Özel OWIN middleware'inden özel LoginProviders'a kadar her şeyi denedim ve hiçbiri istediğimi almadı. Kendi özel AuthorizationAttribute'imi oluşturabilirdim, ancak boru hattında, yalnızca hak taleplerini ekleyebildiğim ve her zamanki AuthorizeAttribute [Authorize (Roles = "Kullanıcı, Yönetici") kullanabileceğimi düşündüm.)]. Aşağıdaki çözüm, bu hedefi gerçekleştirir. Ama şimdi, Microsoft.WindowsAzure. * 'Un istediğimden daha çok iç işleyişi hakkında daha çok şey biliyorum. :) –

cevap

4

Çözümü buldum. Bu içerir:

  1. kendi ServiceTokenHandler Oluşturma ve belirtilen kullanıcıya bağlantılıdır benim UserProfile tablosundaki roller bulmaya çalışır base.CreateServiceUser (claimsIdentity) için çağrısından sonra mantığı eklemek için CreateServiceUser yöntemi geçersiz iddiaları. Rolleri bulursa, İddia İsteğinin Talepler koleksiyonuna yeni Rol Talepleri ekler.Uygulamanın, bir IServiceTokenHandler istediğinde, AutoFac yeni RolesServiceTokenHandler döndürmesini sağlayacak şekilde

    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 olarak AutoFac ile yeni RolesServiceTokenHandler kaydedin. gibi görünüyor böylece WebApiConfig.cs dosyanın statik Kayıt yöntemiyle İçinde

, ServiceConfig.Initialize çağrısı değiştirin: Bu bana dün bütün gün sürdü

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

Sen gibi bir şey ile, kullanıcı Principal Rolü Talebini ekleyebilirsiniz:

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

ama o zaman sadece rol tabanlı yetkilendirme sağlamak için de alır iddialar bilgisini doğrulayarak itimat ki?

Sen AuthorizeLevelAttribute veya başka özel aracılığı zaten yetki ve doğrulama işlemek gerekir özellik yerine, yöntemlerinizi süslemek için; ve kullanıcının rolünü doğrulamak için yerinde olması gereken davranışı programlamanız gerekir. Rol üyeliğini nasıl doğrulamanız gerekiyorsa o zaman OnAuthorization yönteminin geçersiz kılınması gerekir ve bu size bağlıdır: Db, Grafik API'nizi veya başka bir şeyi sorgulayabilirsiniz. Ben yönetme yetkisinin diğer seçenekler, bu anda, orada sanmıyorum ve dokümantasyon ve örnekler bu şekilde bazı iyi referans İşte

de işaret:

İlgili konular