将用户的角色与他的名字保持在一起是个好主意,例如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
时,您必须将其拆分为仅获取用户名
有更好的选择吗?
答案 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.Name
和User.Identity.IsInRole
仍可按预期工作。
This question包含有关使用身份验证票证的UserData属性存储用户角色的更多信息。
答案 2 :(得分:1)
您将无法使用此功能进行实时用户角色更新,他们必须注销并再次注册以获取新角色。