我有IdP启动了SSO设置,其中任何浏览https://www.xxxxxx.com
的人都被重定向到https://www.yyyyyy.com
进行身份验证,并且在成功验证主机yyyyyy.com
后将SAML响应发送回回调URL https://www.xxxxxx.com/SAML
。
urls.py
url(r'^SAML$', views.index, name='index'),
url(r'^home$', views.home, name='home'),
url(r'^$', RedirectView.as_view(url='https://www.yyyyyy.com', permanent=True)),
views.py
@csrf_exempt
def index(request):
if request.method == 'POST':
...
...
return redirect('/home')
else:
return redirect('/')
@login_required(login_url='/')
def home(request):
return render(request, 'myapp/index.html')
settings.py
CSRF_TRUSTED_ORIGINS = ['yyyyyy.com']
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.middleware.cache.UpdateCacheMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.common.BrokenLinkEmailsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
当我在索引视图上使用csrf_exempt时,一切正常,但如果删除csrf_exempt,则会出现Cookie Not Set
错误。我有2个问题,
我正在使用Django == 1.9.5和Python 3.5.1
答案 0 :(得分:0)
Django检查request.POST
中的CSRF令牌(在ajax请求的标头中)是否与CSRF cookie匹配。
对于此视图,发布请求来自不同的域,该域不具有传递CSRF检查所需的令牌。因此,您需要将csrf_exempt
用于此视图。
答案 1 :(得分:0)
是的,您需要使用csrf_exempt装饰器,因为每次它传递csrf令牌以检入POST请求时,登录时都不必传递csrf令牌。
有时可能会因缺少csrf或登录时输入错误而导致异常。
因此作为代码放置:
@csrf_exempt
def login_to_page():