2014-02-17 90 views
1

我有一个Django应用程序,它位于Nginx后面,它需要用户通过政府CAC(智能卡)进行身份验证。 CAC ID由Nginx读取并传递给Django,Django将该ID映射到Django用户并登录该用户。这部分工作正常。如何让NGINX/Django在CAC /智能卡被移除时检测到?

但是,如果用户将他/她的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; 
    } 
} 

回答

1

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

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

你所要求的是,当你放下你的钥匙卡时,你会立即拿起并从建筑物中取出。 您会发现问题,正常程序是走出建筑物,这意味着客户端行为。因此,您最好的选择是在移除卡式钥匙后从客户端发送注销请求。这是一个主题,作为answered here

+0

很棒的比喻,谢谢你的解释! – PaulP