如何在ASP.NET MVC中手动设置用户角色?

时间:2009-08-19 02:25:30

标签: asp.net asp.net-mvc roles membership-provider

我正在研究的这个项目要求我保留一个管理员用户的本地数据库,并为常规用户使用外部数据库。任何在admin db中通过身份验证的人都应该被分配“admin”角色,通过另一个db验证的任何人都将被分配一个“用户”角色。

我可以手动分配这些角色吗?我不需要角色提供程序或其他任何东西的复杂性,因为我只使用这两个角色,这些角色总是基于他们通过哪个db进行身份验证。

如果您可以提供示例代码或指向某些文档的链接,那将是一个巨大的帮助。谢谢!

修改

目前我没有使用角色提供程序,创建一个似乎很麻烦。我知道它不是'最佳实践',但我只需要在登录期间分配2个角色中的1个(这永远不会改变)。将角色信息存储在数据库中也没有意义,因为用户已经按角色分为2个dbs。

这是一些伪代码:

if (AdminDB.ValidateUser(username,password)==true) {
     SetAuthCookie(username);
     AssociateUserWithRole(username, 'admin');
} elseif (UserDB.ValidateUser(username,password)==true) {
     SetAuthCookie(username);
     AssociateUserWithRole(username, 'user');
} else {
     // Login failed.
}

它的'ThisSession.AssociateUserWithRole'部分我不知道。基本上,用户通过身份验证后,我需要告诉.NET用户所属的角色。

4 个答案:

答案 0 :(得分:15)

Implementing a role provider并不是特别难 - 尤其是如果您只是实施角色检查,而不是角色管理。只需实现您需要的那些部分,并让其余部分抛出NotImplementedExceptions。如果您只有一个应用程序,您也不必过于关注该部分。请注意,您需要的部分将取决于框架如何使用它,而不是您将如何使用它。我想例如,你需要实现返回所有用户角色的位,即使你只想检查它们是否处于特定角色。

也就是说,您可以省略整个RoleProvider并在Session中完成整个过程。在这种情况下,您将实现自己的AuthorizeAttribute并用自己的身份替换它的身份验证和角色检查位。经过身份验证后,将用户的角色存储在会话中,并使用您的属性以及为您使用它设置的方法/类的属性提供的参数在那里进行检查。

答案 1 :(得分:6)

如果您正在使用会员资格&在asp.net中构建的角色然后查看AddUserToRole和RemoveUserFromRole:

http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx

根据他们登录的方式,您可以根据需要添加和删除它们。

如果您没有使用角色提供程序,或者您说您不想创建自己的角色提供程序,我无法从您的帖子中说出来。如果您没有使用内置角色提供程序,那么您将必须使用您所拥有的任何编码机制来根据登录方式/位置在登录时切换用户。

编辑:现在你已经展示了你的代码并声明你没有使用asp.net角色引擎。

您正在使用它出现的表单auth cookie,因此覆盖global.asax文件的authenticateRequest并根据需要设置角色并创建您的票证。

以下是以下示例: http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html

该示例仅“获取”角色,但您可以在此处添加/更改角色。

答案 2 :(得分:2)

我相信这篇文章(尽管从2003年开始)清楚地描述了为用户分配角色并在每个请求上替换主体的过程(类似于NerdDinner所做的):

使用基于角色的安全性授权用户: http://msdn.microsoft.com/en-us/library/aa289844%28v=vs.71%29.aspx

答案 3 :(得分:1)

如果有人遇到与OWIN相同的问题,我想这可能会有所帮助:

var identityResult = await manager.CreateIdentityAsync(login, "MyAppCookie");

if (<user is admin>)
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "Admin"));
else
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "User"));

HttpContext.Current.GetOwinContext().Authentication.SignIn(identityResult);