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

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 中手动设置用户角色?【英文标题】:How do I manually set a user's role in ASP.NET MVC? 【发布时间】:2010-11-20 19:37:11 【问题描述】:

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

我可以手动分配这些角色吗?我不需要角色提供者或任何东西的复杂性,因为我只使用这两个角色,这两个角色总是基于他们验证的数据库。

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

编辑:

目前我没有使用角色提供者,创建角色提供者似乎很麻​​烦。我知道它不是“最佳实践”,但我只需要在登录期间分配 2 个角色中的 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 用户属于哪个角色。

【问题讨论】:

【参考方案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);

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

如果您使用的是 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 的解决方案最适合我的需要。不过感谢您的帮助!我很感激。【参考方案4】:

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

也就是说,您可以省略整个 RoleProvider 并在 Session 中完成所有事情。在这种情况下,您将实现自己的AuthorizeAttribute 并用您自己的替换它的身份验证和角色检查位。一旦通过身份验证,将用户的角色存储在会话中,并使用您的属性和提供给您装饰它的方法/类的属性的参数在那里检查它。

【讨论】:

自定义 AuthorizeAttribute 对我来说最有意义(来自 php 领域的 .NET MVC 菜鸟)。感谢您的帮助! 你的意思是使用Session 这样吗?:在登录-> Session.Add("LoggedInRole", "admin"); 并且当我需要当前用户的类型时,从Session 读取它。 Session 是否足够安全,可以在其中保存用户类型(角色)? @MajidR Session 通常都是服务器端的,因此从入侵的角度来看,它的安全性不亚于角色提供者。显然,您必须自己编写所有逻辑,因此,从健壮性的角度来看,这取决于。我可能会走RoleProvider 路线。 @MajidR 我不确定你在问什么。要使用内置角色处理,您可以使用现有的角色提供程序实现(ASP 有现成的 Active Directory 和 SQL 提供程序)或创建自己的,然后将其与 AuthorizeAttribute @MajidR 再次,我不确定你在问什么。使用 Session 不会免除您对安全性的担忧,包括拥有访问受限操作的适当权限。另一方面,对 Session 的访问受到限制(代码无法从您的 Session 访问其他用户的 Session),因此如果天真地使用它似乎是一种安全的方法,尽管它更通用、更不健壮。除非您真的确定自己在做什么,否则您可能想要使用现有的提供商之一。配置现有提供程序比构建自己的提供程序更具挑战性。

以上是关于如何在 ASP.NET MVC 中手动设置用户角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 5 中列出具有角色名称的用户

如何使用 asp.net mvc 从头开始​​添加用户角色

是否可以在 MVC for Asp.NET 中使用 Outlook 电子邮件组作为角色?

ASP.NET Core 3.1 MVC 如何让用户在注册时选择自己的角色?

ASP.NET MVC 角色授权

获取所有用户及其角色进入表 asp.net mvc