2014-02-17 85 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