【发布时间】:2023-04-05 17:32:02
【问题描述】:
我最近接到了一项任务,为属于特定角色的用户创建单独的登录名。已经为主要用户实现了登录,这是通过使用分配给 Thread.CurrentPrincipal 的 Principal 完成的,以后每次加载页面时都会检查其值。我修改了我的代码以使用相同的身份验证机制,因此在我的自定义登录中我创建了自定义主体并将其分配给Thread.CurrentPrincipal。现在的问题是,使用自定义登录我会覆盖我的正常登录,反之亦然。是否可以将我的原则分配给Thread.CurrentPrincipal 以外的其他地方,以允许两种登录变体同时工作?如果这是不可能的,我想了解替代方案:)
【问题讨论】:
-
“单独登录”是什么意思? “我覆盖了我的正常登录”是什么意思?
-
您的意思是希望您的应用程序允许,例如,基于声明和基于表单的身份验证?
-
您根本不应该更改线程原理,将您的身份验证信息存储在会话对象或 cookie 中。如果您希望它更安全,请仅存储加密的身份验证密钥并在数据库或其他数据存储中查找经过身份验证的用户的原则。 ASP.net 具有您应该尝试使用的内置身份验证提供程序。
-
“单独登录”是指某些控制器可以通过第一种登录类型访问,而其他控制器可以通过我的自定义登录类型访问。登录是使用不同的用户凭据(密码、密码、...)和不同的形式完成的。通过覆盖我的正常登录,我的意思是,如果我以普通用户身份登录,然后通过我的自定义登录登录 Thread.Principle 将被我的自定义原则覆盖,因此主登录不再有效。所以我可以假设现有的使用 Thread.Principle 登录是不好的做法,我应该尝试使用会话或 cookie 来实现我的身份验证?
-
@RonBeyer 更改 Thread 主体是一种非常常见且有效的做法,例如在使用自定义安全主体对象时。将身份验证信息存储在 Session 或 cookie 中不会使其对底层提供者可用。它只是允许在页面之间持久化它。
标签: c# asp.net session principal