Пользовательская аутентификация и авторизация на основе прав пользователя

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

enter image description here

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

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

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

Ответ 1

Конечно, 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 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 claims 
    // simply by casting User.Identity to ClaimsIdentity
    // ((ClaimsIdentity)User.Identity).Claims
}

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