Как насчет хранения ролей вместе с именем в user.identity.name | FormsAuth.SetAuthCookie (strUser + "|" + strUserRole) - PullRequest
0 голосов
/ 22 февраля 2010

Это хорошая идея, чтобы сохранить роль пользователя вместе с его именем, например, с setAuthCookie, вы:

formsAuthSrv.SetAuthCookie(strUser+strRole);

и вы можете создать свой собственный поставщик ролей следующим образом:

public class MyRoleProvider : RoleProvider
    {
        public override string[] GetRolesForUser(string username)
        {
             // get the roles from username and return it as an string[]      
..     
                return new string[] { role };
        }
    }

и когда вы звоните user.identity.name, вам нужно разделить его, чтобы получить только имя пользователя

Есть ли лучшая альтернатива?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

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

Я предлагаю создать пользовательский билет FormsAuthenticationTicket. Одним из значений в этом билете, кроме имени пользователя, является userData. В этом значении вы можете хранить роли пользователя. С каждым запросом вы можете прочитать этот файл cookie и создать правильную идентификацию с ролями.

Проверьте здесь для получения дополнительной информации об этом методе: http://msdn.microsoft.com/en-us/library/aa289844%28VS.71%29.aspx

2 голосов
/ 22 февраля 2010

Я бы советовал против этого. IIdentity.Name обычно используется для хранения идентификатора пользователя, такого как имя пользователя или идентификатор. Изменение его использования будет означать, что стандартные методы работы с кодом, такие как использование HttpContext.User.Identity.Name, не будут работать должным образом и могут привести к путанице, если вы или другие будете поддерживать свой код в будущем.

Поскольку IIdentity.Name взято из билета аутентификации (по умолчанию), имеет смысл сохранять информацию о роли в свойстве UserData билета аутентификации.

Затем вы можете извлечь эту информацию в своем RoleProvider или создать собственный IPrincipal для каждого запроса. Таким образом, User.Identity.Name и User.Identity.IsInRole все равно будут работать, как и ожидалось.

Этот вопрос содержит дополнительную информацию об использовании свойства UserData билета аутентификации для хранения пользовательских ролей.

1 голос
/ 22 февраля 2010

Вы не сможете делать живые обновления ролей пользователей с этим, им придется выходить из системы и снова, чтобы подобрать новые роли.

...