3

我有一个位于 Nginx 后面的 Django 应用程序,它要求用户通过政府 CAC(智能卡)进行身份验证。CAC ID 由 Nginx 读取并传递给 Django,后者将该 ID 映射到 Django 用户并登录该用户。那部分工作正常。

但是,如果用户从读卡器中删除他/她的 CAC,应用程序仍然会愉快地移动,允许用户继续从该域加载页面。

如何强制 Nginx 在每个页面加载时验证 CAC 证书,以便在删除 CAC 后,Django 可以注销用户并强制他们重新验证?

Nginx 配置:

server {
  listen 443 ssl;

  server_name my-server;
  ssl_certificate ssl/server.crt;
  ssl_certificate_key ssl/server.key;
  ssl_verify_client on;
  ssl_verify_depth 2;
  ssl_client_certificate /etc/ssl/certs/dod-root-certs.pem;

  location /static/ {
    alias /etc/nginx/static/;
    expires 30d;
  }

  location / {
    proxy_pass         http://localhost:8000/;
    proxy_redirect     off;
    proxy_set_header   Host       $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Scheme   $scheme;

    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Protocol  ssl;

    proxy_set_header   X-SSL-User-DN   $ssl_client_s_dn;
    proxy_set_header   X-SSL-Authenticated $ssl_client_verify;

    proxy_connect_timeout 60;
    proxy_read_timeout 60;
  }
}
4

1 回答 1

3

这在服务器端和 nginx 控制之外是不可能的。SSL 的本质是它可以进行身份​​验证和授权,但它会使用会话来记住它的决定。

将站点视为建筑物。一旦您使用某种钥匙卡进行身份验证,您就可以进入并且可以自由地四处走动。可能存在您需要额外授权的区域,您在入口处提供的凭据将用于此目的。

您所要求的是,当您放下钥匙卡时,您将立即被捡起并从建筑物中移除。您会看到问题所在,正常程序是走出大楼,这意味着客户端采取行动。因此,您最好的选择是在移除钥匙卡后从客户端发送注销请求。正如此处回答的那样,这本身就是一个主题。

于 2014-02-18T07:50:20.303 回答