我有一个位于Nginx后面的Django应用程序,它要求用户通过政府CAC(智能卡)进行身份验证。 CAC ID由Nginx读取并传递给Django,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;
}
}
答案 0 :(得分:2)
这在服务器端和nginx控件之外是不可能的。 SSL的本质是它可以进行身份验证和授权,但它会使用会话来记住它的决定。
将该网站视为建筑物。一旦您使用某种钥匙卡进行身份验证,您就可以自由地走动。您可能需要获得额外授权的区域,并且您将在入口处提供您的凭据。
您要求的是,当您放下钥匙卡时,您将立即被取走并从建筑物中移除。 你看到了问题,正常的程序是走出建筑物,这意味着客户端的行动。因此,最好的办法是在删除密钥卡后从客户端发送注销请求。这是一个独立的主题answered here。