2015-05-01 3 views
10

В настоящее время я разрабатываю приложение ASP.Net MVC 5 с базой данных сервера MS Sql. Мне нужно реализовать проверку подлинности и авторизацию на основе идентификатора ASP.Net 2.0. Я просто рассмотрел базовые концепции Identity и попытаюсь реализовать их в своем приложении. Поскольку база данных уже определена, мне нужно немного настроить Identity. Когда я смотрел на базу данных, таблицы немного отличаются друг от друга, что я обычно нашел в проектах идентификации идентичности.Пользовательская аутентификация и авторизация на основе прав пользователя

enter image description here

От изображения вы можете увидеть, что есть таблица с именем группы пользователей и определенный набор прав на них на основе модуля. Те же права будут доступны пользователю по умолчанию. Если вы хотите изменить какие-либо права, вы можете переопределить их, установив разрешение в таблице прав пользователя.

Итак, мой первый вопрос: ASP. Net Identity с пользовательской авторизацией и авторизацией является правильным методом для реализации такого сценария?

С точки зрения зрения, мне нужно создать меню на основе прав пользователя/группы пользователей, а также хотеть включать/отключать кнопки на их основе. Мне удалось создать меню на основе значений базы данных. Но мне нужно разрешить каждый клиентский запрос, и для этого я считаю, что AuthorizeAttribute - лучший вариант. Пожалуйста, предложите? Любые хорошие шаблоны дизайна или сообщения оцениваются.

ответ

17

Sure Identity настолько мощный и гибкий, что вы можете настроить его. Используйте ваше право пользователя в качестве претензии затем написать настроенные AuthorizeAttribute проверить требования к примеру рассмотреть этот код:

[HttpPost] 
public ActionResult Login(string username, string password) 
{ 
    if (_userManager.IsValid(username, password)) // your own user manager 
    { 
     var ident = new ClaimsIdentity(
      new[] 
      { 
       // adding following 2 claim just for supporting default antiforgery provider 
       new Claim(ClaimTypes.NameIdentifier, username), 
       new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"), 

       new Claim(ClaimTypes.Name, username), 
       // populate assigned user rightID's form the DB and add each one as a claim 
       new Claim("UserRight","FirstAssignedUserRightID"), 
       new Claim("UserRight","SecondAssignedUserRightID"), 
      }, 
      DefaultAuthenticationTypes.ApplicationCookie); 

     HttpContext.GetOwinContext().Authentication.SignIn(
      new AuthenticationProperties { IsPersistent = false }, ident); 
     return RedirectToAction("MyAction"); // auth succeed 
    } 
    // invalid username or password 
    ModelState.AddModelError("", "invalid username or password"); 
    return View(); 
} 

И писать претензии на основе атрибут авторизовать:

public class ClaimsAccessAttribute : AuthorizeAttribute 
{ 
    // in the real world you could get claim value form the DB, 
    // I simplified the example 
    public string ClaimType { get; set; } 
    public string Value { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase context) 
    { 
     return context.User.Identity.IsAuthenticated 
      && context.User.Identity is ClaimsIdentity 
      && ((ClaimsIdentity)context.User.Identity).HasClaim(x => 
       x.Type == ClaimType && x.Value == Value); 
    } 
} 

В конце вам просто нужно чтобы добавить атрибут к вашим действиям:

[ClaimsAccess(CliamType="UserRight",Value="YourRightID"] 
public ActionResult MyAction() 
{ 
    // also you have access the authenticated user's claims 
    // simply by casting User.Identity to ClaimsIdentity 
    // ((ClaimsIdentity)User.Identity).Claims 
} 

я пропустил группу пользователей для упрощения примера, а также я жёстко некоторые части, которые вы должны предписание e провайдер для извлечения из БД.

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