18

我正在进行的这个项目需要我保留一个本地管理员用户数据库,并为普通用户使用一个外部数据库。在 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 用户属于哪个角色。

4

4 回答 4

16

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

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

于 2009-08-19T02:52:46.050 回答
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

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

于 2009-08-19T02:33:50.123 回答
2

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

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

于 2011-09-21T19:35:41.190 回答
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);
于 2016-06-02T10:37:31.273 回答