【发布时间】:2019-03-14 14:14:12
【问题描述】:
我仍在学习身份框架,并且在尝试在我的 .Net Core 2 MVC 应用程序中设置身份验证时迷失了方向。感谢任何建议,因为我什至不确定我在做什么是正确的。
我需要集成 OpenID Connect 身份提供程序以进行身份验证,并使用辅助数据源进行授权。不方便的是,除了名称声明之外,我不能使用来自 OIDC IdP 的任何声明。其余用户声明必须来自辅助数据源(通过自定义UserStore 和User 实体连接到身份框架)。
我正在使用OpenId Connect provider 来处理身份验证。这工作正常,并给了我第一个身份(我只能使用一个声明)。当我需要获取用户的第二个身份、将其添加到主体并将其设置为默认 Identity 时,我的困惑就开始了。第二个Identity 提供所有用户声明,包括角色。
我对身份框架的理解是我应该有一个带有两个身份的ClaimsPrincipal,以便我可以插入身份框架的其余部分。但是,对于两个身份,默认 ClaimsPrincipal 将自动选择第一个身份(这是我不能使用的身份),因此看来我应该创建一个自定义 ClaimsPrincipal 并设置 PrimaryIdentitySelector 以便我的第二个身份是主要的。
public class MyClaimsPrincipal : ClaimsPrincipal
{
private static readonly Func<IEnumerable<ClaimsIdentity>, ClaimsIdentity> IdentitySelector = SelectPrimaryIdentity;
/// <summary>
/// This method iterates through the collection of ClaimsIdentities and chooses an identity as the primary.
/// </summary>
private static ClaimsIdentity SelectPrimaryIdentity(IEnumerable<ClaimsIdentity> identities)
{
// Find and return the second identity
}
}
从 OIDC IdP 获得经过验证的令牌后,我会获取第二个身份,创建一个新的 MyClaimsPrincipal,将这两个身份添加到新的主体。在那之后,我不确定如何处理这个新校长。
我尝试通过SignInManager 登录用户,在HTTP 上下文中明确设置用户,并使用中间件将ClaimsPrincipals 转换为MyClaimsPrincipals,但所有这些似乎都无济于事。我想我没有抓住重点。
一些具体问题:
- 这是最好的方法吗?通常对所有这些都感到困惑,因此很难判断我是否走在正确的轨道上。
- 创建自定义主体后,如何将其“设置”到 HTTP 上下文中以使其持久化?
- Cookie 身份验证如何与 OpenId Connect 身份验证配合使用?似乎 OIDC 以某种方式将用户传递给 Cookie 身份验证,并且 OIDC 身份验证需要添加 cookie 身份验证才能工作。
【问题讨论】:
标签: c# asp.net-core asp.net-core-2.0 openid-connect