2014-11-20 3 views
1

В моем приложении есть три типа пользователей. Admin, SuperAdmin, Normal Users. Я хочу сделать аутентификацию без концепции ролей и с помощью претензий. В asp.net есть таблица под названием AspNetClaims в db. Как заполнить эту таблицу претензиями? Когда регистрируется первый пользователь, ему должен быть назначен запрос (admin, superadmin, user). Затем, после входа в систему, я должен быть в состоянии найти тип пользователя. Как я могу это получить?Проверка подлинности на основе утверждений в MVC5

Мой еще один вопрос: в этом случае правильно ли утверждать утверждения на основе утверждений без какой-либо концепции ролей?

+1

В чем отличие ваших претензий к ролям? вы в значительной степени создаете роли, но сохраняете их в качестве претензий. Сделайте вашу жизнь проще и просто поиграйте с ролями. – trailmax

+1

Обратите внимание, что MVC5 создает претензии для ролей. Таким образом, ваш запрос уже выполнен на самом деле. – Shoe

ответ

0

Если вы только когда-либо будете иметь типы пользователей, где это нормально для всех пользователей данного типа, имеющих одинаковые разрешения (а не, например, для того, чтобы разрешения могли отличаться пользователем для разных записей данных), тогда вы фактически делаете то же самое, как если бы вы использовали разрешения на основе ролей, а не основанные на требованиях.

Вопрос использования претензий заключается в том, что он позволяет делать все, что вы могли бы сделать через Роли и многое другое. Претензии дают вам большую гибкость: например, ваша база данных может содержать данные для нескольких разных клиентов (ClientA и ClientB), у каждого из которых может быть пользователь Admin (например, AdminUserA и AdminUserB), но у которых есть только права администратора на записи, относящиеся к конкретному клиенту, к которому они принадлежат.

В этой ситуации вы можете достичь этого, предоставив пользователю AdminUserA заявку типа ClientA со значением Admin и пользователем AdminUserB, претендуя на тип ClientB со значением Admin. Затем в коде вы разрешаете пользователям с требованием значение «Админ» для утверждения для администрирования записей для клиента с именем клиента.

См. Мой комментарий к How to add claims in ASP.NET Identity для двух разных способов добавления претензии к пользователю (к сожалению, Microsoft, похоже, не документировала это так, поэтому неясно, нужны ли оба метода!). Как уже упоминалось, вы можете добавить претензию к таблице AspNetClaims (но не к файлам cookie) через manager.AddClaim (идентификатор пользователя, требование) в GenerateUserIdentityAsync (менеджер UserManager) для класса ApplicationUser в IdentityModel.cs (в проекте MVC5).

Вы можете проверить, какие претензии у пользователя следующим образом: Когда пользователь входит в системе, userIdentity.Claims должен содержать все требования пользователя (в том числе пользовательских требований, которые были в AspNetClaims перед тем пользователь вошел в системе, но не любой добавленный с помощью manager.AddClaim!) и manager.GetClaims (userID) должен вернуть все пользовательские претензии пользователя (, включая, добавленных через manager.AddClaim!). Это беспорядочно, и Microsoft действительно должна убирать это или хотя бы документировать его лучше!

Надеется, что это помогает

1

Шаг 1: Вы должны применить фильтр метода действия, как показано ниже примере

Вот мой метод действий:

[AuthAttribute] 
     [CustomAuthorize("Admin", "SuperAdmin")] 
     public ActionResult GetEmployeeList(string sortOrder, string currentFilter, string searchString, int? page) 
     { 

      List<GetListviewData_Result> listGetListviewData_Result = db.GetListviewData().ToList(); 
return view(listGetListviewData_Result); 
} 

Шаг 2: Вы необходимо написать код в вашем методе фильтра авторизации, как показано ниже.

Это мой авторизованный фильтр:

protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      var userEmailId = httpContext.Session["userName"]; 
      bool authorize = false; 
      foreach (var role in allowedroles) 
      { 
       /* getting user form current context */ 
       var user = context.user_tbl.Where(m => m.emailId == userEmailId && m.role == role); 
       if (user.Count() > 0) 
       { 
        authorize = true; /* return true if Entity has current user(active) with specific role */ 
       } 
      } 
      return authorize; 
     } 
Смежные вопросы