使用IdentityServer4的SSO是否应该在每个请求上都命中授权端点?

时间:2019-02-05 19:06:31

标签: asp.net-core identityserver4

我正在使用IdentityServer4从多个ASP.net Core网站实现单点登录。我能够通过一个站点登录,并且成功地将我登录到另一个站点。但是,我发现奇怪的是,在我登录两个站点后,如果同时浏览了其他站点,则任何需要身份验证/授权的页面都将我重定向回授权端点。一个例子:

+-----+--------------------+-------------------------------------+---------------------------------------------------------------------+
| Seq |        Host        |               Request               |                              Response                               |
+-----+--------------------+-------------------------------------+---------------------------------------------------------------------+
|   1 | apple.example.com  | GET /About                          | 302 Found; Location=https://login.example.com/connect/authorize?... |
|   2 | login.example.com  | GET /connect/authorize?...          | 302 Found; Location=https://login.example.com/Account/Login?…       |
|   3 | login.example.com  | GET Account/Login?…                 | 200 OK                                                              |
|   4 | login.example.com  | POST /Account/Login?...             | 302 Found; Location=/connect/authorize/callback?...                 |
|   5 | login.example.com  | GET /connect/authorize/callback?... | 200 OK                                                              |
|   6 | apple.example.com  | POST /signin-oidc                   | 302 Found; Location=https://apple.example.com/About                 |
|   7 | apple.example.com  | GET /About                          | 200 OK                                                              |
|   8 | banana.example.com | GET /About                          | 302 Found; Location=https://login.example.com/connect/authorize?... |
|   9 | login.example.com  | GET /connect/authorize?...          | 200 OK                                                              |
|  10 | banana.example.com | POST /signin-oidc                   | 302 Found; Location=https://banana.example.com/About                |
|  11 | banana.example.com | GET /About                          | 200 OK                                                              |
|  12 | banana.example.com | GET /About                          | 200 OK                                                              |
|  13 | banana.example.com | GET /About                          | 200 OK                                                              |
|  14 | apple.example.com  | GET /About                          | 302 Found; Location=https://login.example.com/connect/authorize?... |
|  15 | login.example.com  | GET /connect/authorize?...          | 200 OK                                                              |
|  16 | apple.example.com  | POST /signin-oidc                   | 302 Found; Location=https://apple.example.com/About                 |
|  17 | apple.example.com  | GET /About                          | 200 OK                                                              |
|  18 | apple.example.com  | GET /About                          | 200 OK                                                              |
+-----+--------------------+-------------------------------------+---------------------------------------------------------------------+

在Seq = 11之前,一切正常。我登录了两个站点(苹果和香蕉),但只输入了一次我的凭据。我上次在banana.example.com上加载了一个页面。只要我停留在该网站上(第12和13行),该网站的Cookie就会起作用。但是,如果我在apple.example.com上加载了另一个页面,即使我已经在该站点上进行了身份验证,它也会将我带回到授权端点。这令我惊讶。这种情况一直在发生-每当我切换站点时,都必须再次访问身份服务器。我不必重新输入我的凭据,但是重定向有点麻烦。我特别担心它将干扰POST请求。

我们的网站如此,用户经常会同时使用多个站点,来回切换。

这是应该工作的方式吗,还是我的配置有问题?我希望每个站点只需点击一次授权端点。

1 个答案:

答案 0 :(得分:1)

您的期望是正确的。确保为每个应用程序使用不同的Cookie名称,否则它将导致您描述的确切行为。

您可以在身份验证服务配置中设置cookie名称:

services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; })
        .AddCookie(options =>
        {
            options.Cookie.Name = "someCookieName";
        })