我在.net核心
中有多个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
}
然后我可以使用 [授权(AuthenticationSchemes =“Main”)] 哪个工作正常 现在对于某些类型的请求,我将要求用户登录其他提供商(请不要反驳这种方法,让我们假设我必须做的事情)
.AddOpenIdConnect("Special", "Special", options => {
options.Authority = "OpenID-Special-url";
options.ClientId = "OpenID-Special-d";
options.ClientSecret = "OpenID-Special-secret";
//some other options
}
然后在我的一个结尾中同时拥有 [授权(AuthenticationSchemes =“Main”)] [授权(AuthenticationSchemes =“特殊”)] 因此,只有用户在Main& Special可以执行请求,我可以从Special获得idToken。
我像Corellation这样的错误失败了。我试图提供siddwewnr CorrelationCookie.Name,但没有成功;试图覆盖一些基本的auth类,但也卡住并复制多个代码部分。
我的问题是
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?
---编辑---
解决方案 为每个提供商设置唯一Cookie,CallbackPath,为每个提供商提供Cookie的SinginScheme
.AddCookie($"Cookie{provider}")
.AddOpenIdConnect($"Sign{provider}",o=>{
o.CallbackPath=$"/sign-{provider}";
o.SinginScheme=$"/Cookie{provider}";
})
现在每个[授权]都有自己的声明,因此无法设置两次[授权],但可以设置主要,并手动检查
var auth = await context.AuthenticateAsync($"Sign{provider}").ConfigureAwait(false);
if(auth==null){
await context.ChallengeAsync($"Sign{provider}").ConfigureAwait(false);
}