ASP.NET Identity - упрощенный - PullRequest
0 голосов
/ 28 мая 2018

Существующая модель базы данных (упрощенная):

enter image description here

  • 1 Пользователь может быть присоединен к 1 или нескольким группам доступа.
  • 1 AccessGroup может иметь 1 или несколько AccessItens.

MSDN говорит:

Когда создается идентификатор, ему может быть назначено одно или несколько утвержденийвыданный доверенной стороной.Претензия - это пара имя-значение, представляющая субъекта, , а не то, что субъект может сделать .

Это не кажется хорошей идеейхранить AccessItems как UserClaims,

, например:

  • UserClaims -> Name = CanDeleteSale;Значение = True

Но с другой стороны, я не могу придумать другого способа сделать это.

После большого поиска я не могу думать, как представить эту модель, используяроли или утверждения в ASP.NET Identity.

Почему?

  • Администратор может настроить AccessGroups , а затем использовать декларативныйРоли не подходят в этом случае.

  • Я могу доверять только AccessItens , потому что они являются фиксированными идентификаторами, как перечисления, поэтому я хотел бы использовать декларативную аутентификацию с этимиспользуя перечисления.

  • Мне нужно сохранить всех пользователей AccessItems после входа пользователя в систему и использовать его для последующих действий аутентификации, используя декларативный способ.

Удостоверение ASP.NET мне кажется красивым, сейчас я пытаюсь его лучше понять.

Извините, если не могу четко выразить свой вопрос, пожалуйста, расскажите мне о любойсомнения.

1 Ответ

0 голосов
/ 29 мая 2018

Я думаю, вы на правильном пути.У меня большой опыт представления ролей пользователей таким образом, и мое личное предпочтение (я имею дело в основном с крупными корпоративными проектами) - использовать идентификацию ASP.NET для аутентификации и обработки контроля доступа с помощью пользовательского кода.

Для небольших проектов, я полагаю, вы можете настроить метод IsUserInRole, как я делал ниже.

public class CustomRoleProvider : RoleProvider
{
    /// <summary>
    /// Gets a list of roles assigned to a particular User
    /// </summary>
    /// <param name="UserID">ID of the User</param>
    /// <param name="context">DbContext</param>
    /// <returns></returns>
    public static List<string> GetUserRoles(int UserID, UserContext context)
    {
        return context.UserList
                      .Where(s => s.UserID == UserID)
                      .SelectMany(s => s.AccessGroup.GroupRoles)
                      .Select(gr => gr.RoleID.ToString()).ToList();
    }

    /// <summary>
    /// Gets a list of roles assigned to a particular user
    /// </summary>
    /// <param name="username">username of the user [or "" for current user]</param>
    /// <param name="context">DbContext</param>
    /// <returns></returns>
    public static List<string> GetUserRoles(string username, UserContext context)
    {
        return context.UserList
                      .Where(s => s.Username == username)
                      .SelectMany(s => s.AccessGroup.GroupRoles)
                      .Select(gr => gr.RoleID.ToString()).ToList();
    }

    //roleName = RoleId; so that only the IDs are stored in session...
    public override bool IsUserInRole(string username, string roleName)
    {
        return GetUserRoles(username, new UserContext()).Contains<string>(roleName);
    }

    public override string[] GetRolesForUser(string username)
    {
        return GetUserRoles(username, new UserContext()).ToArray();
    }

    public override string[] GetAllRoles()
    {
        return new UserContext().UserRoleList.Select(r => r.RoleID.ToString()).ToArray();
    }

    public override bool RoleExists(string roleName)
    {
        return new UserContext().UserRoleList.Where(r => r.RoleID.ToString().Equals(roleName)).Count() > 0;
    }

    public override string ApplicationName
    {
        get { return "Your Application Name"; }
        set { }
    }

    public override string[] GetUsersInRole(string roleName)
    {
        throw new System.NotImplementedException();
    }

    public override string[] FindUsersInRole(string roleName, string usernameToMatch)
    {
        throw new System.NotImplementedException();
    }

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        throw new System.NotImplementedException();
    }

    public override void CreateRole(string roleName)
    {
        throw new System.NotImplementedException();
    }

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
    {
        throw new System.NotImplementedException();
    }

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
    {
        throw new System.NotImplementedException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...