5

Я читал много сообщений в блогах и ответов stackoverflow, но все же я не могу найти проект с открытым исходным кодом в реальном мире, который использует проверку подлинности на основе утверждений и авторизацию, чтобы я мог получить идея о том, как их реализовать.Утверждение на основе утверждений с помощью ASP.NET MVC

До сих пор я мог найти Thinktecture.IdentityModel и this blog, применяя авторизацию на основе примера на веб-сайте примера. Если вы, ребята, можете указать мне некоторые проекты с открытым исходным кодом, используя претензии, это было бы очень полезно.

Что мне интересно, так это как получить претензии к моему приложению, используя базу данных.

До сих пор, что я пробовал, заключается в том, что использование хранилища претензий в памяти для имитации databsae, я создал CustomClaimsTransformer и CustomAuthorisationManager вот так.

public class CustomClaimsTransformer : ClaimsAuthenticationManager 
    { 
     public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
     { 
      //validate name claim 
      string nameClaimValue = incomingPrincipal.Identity.Name; 

      return CreatePrincipal(nameClaimValue); 
     } 

     private ClaimsPrincipal CreatePrincipal(string userName) 
     { 
      int userId = ClaimStore.Users.First(u => u.Value == userName).Key; 
      var claims = ClaimStore.ClaimsSet.Where(c => c.Key == userId); 

      var claimsCollection = claims.Select(kp => kp.Value).ToList(); 

      return new ClaimsPrincipal(new ClaimsIdentity(claimsCollection, "Custom")); 
     } 
    } 

public class CustomAuthorisationManager : ClaimsAuthorizationManager 
    { 
     public override bool CheckAccess(AuthorizationContext context) 
     { 
      string resource = context.Resource.First().Value; 
      string action = context.Action.First().Value; 

      if (action == "Show" && resource == "Code") 
      { 
       bool likesJava = context.Principal.HasClaim(ClaimStore._httpMyclaimsUsers, "True"); 
       return likesJava; 
      } 
      else if (action == "Read" && resource == "Departments") 
      { 
       bool readDeps = context.Principal.HasClaim(ClaimStore._httpMyclaimsDepartments, "Read"); 
       return readDeps; 
      } 
      return false; 
     } 
    } 

Как реализовать их в реальном мире, не имея слишком много условий ЕС?

+0

как вы в конечном итоге это сделали? можете ли вы предоставить ответ – Moes

ответ

0

Наконец-то мне удалось создать собственную систему с требуемой функциональностью, используя существующие таблицы asp.net identity 2.0 + несколько моих собственных.

Я собираюсь вызывать каждое трио AREA-CONTROLLER-ACTION в качестве ресурсов в моей системе. Включен WebAPI. Область сама по себе является ресурсом. Сам контроллер - это ресурс. Само действие - это ресурс. Любая их комбинация также является ресурсом. Я буду автоматически генерировать все из самой системы, используя отражение.

Кроме того, я собираюсь использовать ту же таблицу AspNetRoles для хранения моих групп пользователей. Пользователи принадлежат к одной или нескольким группам (Super Admin, Admin, Agent, Client и т. Д.).

Использование существующей модели на основе ролей в качестве модели на основе группы пользователей с претензиями, я мог бы заставить ее работать. Супер администраторы находятся в режиме бога. Они могут создавать пользователей/группы нижнего уровня/назначать разрешения и т. Д.

Пользователи могут иметь специальные разрешения. Например, группе «Все в агенте» запрещен доступ к обновлению отеля, но специальному агенту, который также может быть владельцем отеля, может быть предоставлен конкретный доступ к обновлению только их отеля.

Поскольку вся система контроля доступа работает на наборах действий контроллера зоны MVC. Никто изначально не имеет доступа (включая супер админов), и мы постепенно определяем, к каким частям к ним принадлежат группы/пользователи. И мы предоставляем супер админам и админам эксклюзивный доступ через заявку. По умолчанию доступ к повсеместно запрещен.

После того, как я создал автоматические установки AREA-CONTROLLER-ACTION, я разрешаю пользователю выбирать, к какой группе относится доступ к какому элементу.

Когда пользователь входит в систему, я получаю все ресурсы, к которым у текущего пользователя есть доступ, и хранить их в качестве претензий. Исходя из этого, используя auth manager, когда пользователь запрашивает доступ к некоторому ресурсу, я могу проверить их претензии и решить, должен ли им быть предоставлен доступ.

foreach(var claim in permissionClaims) { 
    var parts = claim.Value.Split(new [] { 
     '|' 
    }, StringSplitOptions.None); 
    if (parts.Length == 3) { 
     //var httpMethod = parts[0]; 
     var action = parts[1]; 
     var api = parts[2]; 
     //Current.Log.Warn("Checking Access : " + req + " [action: " + action + "]"); 
     // is this request for a API action? 
     if (api.Contains("API")) { 
      // if so, req must be for a API action 
      if (req.Contains("Api") && action.Contains(req)) { 
       Log.Trace("User has access to API : " + req + " [action: " + action + "]"); 
       return true; 
      } 
     } else { 
      // this is for a MVC action 
      if (action.Contains(req)) { 
       Log.Trace("User has access to MVC : " + req + " [action: " + action + "]"); 
       return true; 
      } 
     } 
    } 
} 

Я подробно объяснил подход here - ASP.NET MVC Fine Grained Identity & Access Control.

+0

Хотя это теоретически может ответить на вопрос, [было бы желательно] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылка для справки. –

2

Попробуйте следующую ссылку, похоже, достойными решениями

http://developers.axiomatics.com/blog/index/entry/custom-claims-based-authorization-in-net-using-axiomatics-pep-sdk-for-net.html

Кроме того, вы можете определить свою политику и загрузить его

http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.loadcustomconfiguration.aspx

Как реализовать Требования Авторизации в Применение приложений ASP.NET с использованием WIF и ACS http://msdn.microsoft.com/en-us/library/gg185907.aspx

+0

Благодарим вас за эти ценные ресурсы. Я заглянул в каждый из них, и Axiomatics SDK звучит многообещающе, но я не использую его. Похоже, мне придется идти с пользовательской реализацией с политиками, определенными в файле web.config или в базе данных. Я просто не понимаю, как оценивать правила. –

+0

(отказ от ответственности - я работаю для аксиоматики). Переход к пользовательской реализации никогда не является хорошим способом. Существует множество инфраструктур, которые обслуживают целый ряд полномочий - от простого до сложного. Microsoft даже имеет встроенную систему authZ на основе утверждений. Реализация вашего собственного, определенно, не способ пойти –

Смежные вопросы