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

18

我正在开发的项目需要我在本地保留管理员用户的数据库并在另一个外部数据库中使用普通用户。 任何通过管理员数据库身份验证的人都应被分配“管理员”角色,而通过其他数据库进行身份验证的任何人都将始终被分配“用户”角色。

我能手动分配这些角色吗? 我不需要角色提供程序或类似的复杂性,因为我仅使用这两个角色,这些角色将始终基于他们使用的身份验证数据库。

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

编辑:

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

以下是一些伪代码:

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个回答

16

实现角色提供程序并不特别困难 - 特别是如果您只实现了角色检查而没有实现角色管理。只需实现您需要的部分,其余部分抛出NotImplementedExceptions即可。如果您只有一个应用程序,您也不必太担心该部分。请注意,您需要的部分将由框架如何使用它来决定,而不是您如何使用它。例如,我认为您需要实现返回所有用户角色的位,即使您只想检查他们是否在特定角色中。

话虽如此,您可以省略整个RoleProvider,在Session中完成所有操作。在这种情况下,您将实现自己的AuthorizeAttribute并将其身份验证和角色检查位替换为自己的。一旦经过身份验证,将用户的角色存储在会话中,并在使用属性的方法/类所装饰的参数中使用您的属性对其进行检查。


你的意思是在登录时使用 Session,像这样:Session.Add("LoggedInRole", "admin");,并且当我需要当前用户类型时,从 Session 中读取它。Session 足够安全,可以将用户类型(角色)保存在其中吗? - Majid
1
@MajidR “Session” 通常全部位于服务器端,因此从入侵的角度来看,它并不比角色提供程序更加安全。显然,您必须自己编写所有逻辑代码,因此从健壮性的角度来看,具体情况取决于开发人员。我可能会选择使用“RoleProvider”。 - tvanfosson
1
@MajidR 我不确定你在问什么。要使用内置的角色处理,您可以使用现有的角色提供程序实现(ASP具有开箱即用的Active Directory和SQL提供程序),或者创建自己的提供程序,然后与AuthorizeAttribute一起使用。 - tvanfosson
抱歉,我头疼了。我想问一下,“如果我使用Session来存储当前用户类型,我需要担心应用程序安全吗?” - Majid
1
@MajidR 再次提醒,我不确定你在问什么。使用Session并不能使你免于担心安全问题,包括获取访问受限操作的适当权限。另一方面,Session的访问是受限制的(代码无法从你的Session中访问另一个用户的Session),因此如果天真地使用,似乎是一种安全但更通用、不太健壮的方法。除非你确信自己知道在做什么,否则你可能想使用现有的提供者之一。配置现有提供者比构建自己的提供者更容易。 - tvanfosson
显示剩余2条评论

6
如果您正在使用内置在asp.net中的成员资格和角色,则请查看AddUserToRole和RemoveUserFromRole:http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx。根据他们的登录方式,您可以根据需要添加和删除他们。
从您的帖子中我无法确定您是否未使用角色提供程序,还是说您不想创建自己的角色提供程序。如果您没有使用内置的角色提供程序,则必须使用您已经放置的编码机制来根据他们的登录方式/位置在登录时切换用户。
编辑:现在您已经展示了您的代码并声明您没有使用asp.net角色引擎。
看起来您正在使用表单身份验证cookie,因此覆盖global.asax文件的authenticateRequest并根据需要设置角色并创建您的票证。
这里有一个示例:http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html。该示例仅“获取”角色,但您可以在此处添加/更改角色。

我认为@tvanfosson的解决方案最适合我所需的。不过还是谢谢你的帮助!我很感激。 - Colin O'Dell

2

如果有人遇到与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);

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接