如何将角色与user.identity.name中的名称保持在一起FormsAuth.SetAuthCookie(strUser +“|”+ strUserRole)

时间:2010-02-22 07:50:27

标签: asp.net asp.net-mvc forms-authentication

将用户的角色与他的名字保持在一起是个好主意,例如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 个答案:

答案 0 :(得分:2)

这是可能的,但我认为这不是一个好主意。例如,您必须确保用户名不包含|签字,因为它会破坏你的分裂。

我建议创建一个自定义FormsAuthenticationTicket。除了用户名之外,此票证中的一个值是userData。在此值中,您可以存储用户的角色。对于每个请求,您都可以阅读此cookie,并使用角色创建正确的标识。

点击此处查看有关此方法的更多信息:http://msdn.microsoft.com/en-us/library/aa289844%28VS.71%29.aspx

答案 1 :(得分:2)

我会反对它。 IIdentity.Name通常用于存储用户标识符,例如用户名或ID。更改其使用意味着标准代码实践(例如使用HttpContext.User.Identity.Name)将无法按预期工作,并且当您或其他人将来维护您的代码时可能会造成混淆。

由于IIdentity.Name取自authentication ticket(默认情况下),因此将角色信息存储在身份验证票证的UserData属性中会更有意义。

然后,您可以在RoleProvider中提取此信息,或为每个请求创建自定义IPrincipal。这样User.Identity.NameUser.Identity.IsInRole仍可按预期工作。

This question包含有关使用身份验证票证的UserData属性存储用户角色的更多信息。

答案 2 :(得分:1)

您将无法使用此功能进行实时用户角色更新,他们必须注销并再次注册以获取新角色。