.net core中的多个OpenIdConnect授权

maq*_*que 6 c# openid authorization oauth-2.0 asp.net-core

我在 .net core 中进行多个 OpenIdConnect 授权时遇到问题

我想要实现的目标: 想象 2 个 openid 提供商 OpenID-Main、OpenID-Special;两者都返回 id 令牌、角色等。现在想象一下,大多数时候我希望我的用户通过 OpenID-Main 登录,这很简单:

.AddOpenIdConnect("Main", "Main", options => {
              options.Authority = "OpenID-Main-url";
              options.ClientId = "OpenID-Main-d";
              options.ClientSecret = "OpenID-Main-secret";
//some other options
}
Run Code Online (Sandbox Code Playgroud)

那么我可以使用[Authorize(AuthenticationSchemes = "Main")] 这很好用现在对于某些类型的请求我将要求用户登录到其他提供商(请不要争论这种方法,让我们假设它是我有的东西去做)

 .AddOpenIdConnect("Special", "Special", options => {
                  options.Authority = "OpenID-Special-url";
                  options.ClientId = "OpenID-Special-d";
                  options.ClientSecret = "OpenID-Special-secret";
    //some other options
    }
Run Code Online (Sandbox Code Playgroud)

然后在我的端点之一中同时拥有[Authorize(AuthenticationSchemes = "Main")] [Authorize(AuthenticationSchemes = "Special")]这样,只有在 Main 和 Special 中都获得授权的用户才能执行请求,并且我可以从中获取 idToken特别的。

我遇到类似相关失败之类的错误。我尝试提供 siddwewnr CorrelationCookie.Name,但没有成功;尝试覆盖一些基本身份验证类,但也卡住并复制多个代码部分。

我的问题是

1. Is it ever possible with Microsoft.AspNetCore.Authentication ?
2. How can I achieve it? Can I do proper CookieBuilder for second auth?
3. How can I manage this easily so that I can get idToken from second cookie?
4. Do I need to write whole handler/extensions/options like those for facebook/google?
Run Code Online (Sandbox Code Playgroud)

vin*_*zee 0

对于每个提供商设置唯一的 Cookie、CallbackPath、为每个提供商的 Cookie 设置 SigninScheme:

.AddCookie($"Cookie{provider}") 
.AddOpenIdConnect($"Sign{provider}", o=>{
    o.CallbackPath=$"/sign-{provider}";
    o.SinginScheme=$"/Cookie{provider}";
})
Run Code Online (Sandbox Code Playgroud)

现在每个[Authorize]都会有自己的声明,所以不能设置两次[Authorize],但可以有一个主要的,并手动检查:

var auth = await context.AuthenticateAsync($"Sign{provider}").ConfigureAwait(false);
if(auth==null){
    await context.ChallengeAsync($"Sign{provider}").ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

此答案是由 OP maque在 CC BY-SA 3.0 下作为对问题Multiple OpenIdConnectauthorization in .net core 的编辑发布的。