.net核心中的多个OpenIdConnect授权

时间:2017-10-30 10:51:44

标签: c# asp.net-core oauth-2.0 authorization openid

我在.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);
}

0 个答案:

没有答案