我的任务是在 nginx 上配置 Kerberos 身份验证。后端是 django。想法是,当向 api 发出请求时,nginx 应该执行 kerberos 身份验证。但如果用户不在域中,则必须重定向到/auth
授权页面,以便用户可以在 django CMS 中注册的帐户下进行身份验证。
域用户身份验证成功。但非域用户存在问题。当您打开进行 API 调用的站点页面时,会出现一个基本身份验证窗口。我使用了指令auth_gss_allow_basic_fallback off
,但这没有帮助。
我该如何禁用此功能并配置重定向到/auth
?
我的配置文件(我没有指定 gzip、headers 等设置):
server {
listen 80;
server_name srv-01.example.com;
proxy_set_header remote-user $remote_user;
location / {
root /opt/site/;
try_files $uri $uri/ /index.html;
}
location /adminpanel {
proxy_pass http://192.168.1.4:4567;
}
location /api {
proxy_pass http://192.168.1.4:4567;
auth_gss on;
auth_gss_realm EXAMPLE.COM;
auth_gss_keytab /etc/krb5.keytab;
auth_gss_service_name HTTP/srv-01.example.com;
auth_gss_allow_basic_fallback off;
}}
谢谢您的帮助!
答案1
我可能错了,但我认为通过 AJAX 进行的 API 调用不会附加身份验证凭据。浏览器将仅将它们附加用于 URL 导航
我有一个非常相似的设置并且它对我有用:
默认 / 处理程序指向登录对话框,但 /auto-login 位于 auth_gss 下
请注意,如果用户未在域中经过身份验证,则 nginx 返回 401,因此通过为此端点重定向 401,我们可以让非 AD 用户获得登录对话框。
/auto-login 处理程序仅创建 django 会话 cookie 并重定向到 /,因此 AD 用户直接登录:
location /auto-login {
uwsgi_pass django;
include /usr/lib/myapp/wsgi/uwsgi_params;
auth_gss on;
auth_gss_realm EXAMPLE.COM;
auth_gss_service_name HTTP/example.com;
auth_gss_allow_basic_fallback off;
error_page 401 /;
}
如果您使用心跳端点,则可以向其中添加相同的设置,这样,如果管理员撤销了凭证,用户就会尽快被踢出。
location /heart-beat {
uwsgi_pass django;
include /usr/lib/myapp/wsgi/uwsgi_params;
auth_gss on;
auth_gss_realm EXAMPLE.COM;
auth_gss_service_name HTTP/example.com;
auth_gss_allow_basic_fallback off;
}