2016-04-29 4 views
0

Ich habe IdP Initiated SSO-Setup, wo jeder Browsing https://www.xxxxxx.com für die Authentifizierung an https://www.yyyyyy.com weitergeleitet werden und nach erfolgreicher Authentifizierung Host yyyyyy.com POST die SAML-Antwort auf Rückruf-URL https://www.xxxxxx.com/SAML.Benötige ich wirklich csrf_exempt in der Django App-Ansicht?

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', 
] 

Alles funktioniert, wenn ich csrf_exempt auf Indexansicht verwenden, aber wenn ich entfernen csrf_exempt ich dann erhalten Cookie Not Set Fehler. Ich habe 2 Fragen,

  1. Benötige ich wirklich csrf_exempt auf meiner Indexansicht? Oder gibt es einen anderen empfohlenen Weg?
  2. Ist die Bestellung für WhiteNoiseMiddleware und BrokenLinkEmails Middleware korrekt?

Ich verwende Django == 1.9.5 und Python 3.5.1

+0

Die Bestellung der Middleware scheint eine separate Frage zu sein, ob 'csrf_exempt' notwendig ist. Die [whitenoisedocs] (http://witenoise.evans.io/en/stable/#quickstart-for-django-apps) sagen, die Middleware sollte über allen Middleware außer Sicherheits Middleware sein, aber Sie haben es unterhalb der 'UpdateCacheMiddleware'. Die [Fehlerberichtsdokumente] (https://docs.djangoproject.com/en/1.9/howto/error-reporting/#errors) sagen, dass ein E-Mail-Dekorator mit einem defekten Link über einer anderen Middleware angezeigt werden sollte, die 404-Fehler abfängt. Du scheinst keine davon aktiviert zu haben, also sieht es für mich in Ordnung aus. – Alasdair

Antwort

0

Django überprüft, ob das Token CSRF in request.POST (im Header für AJAX-Anfragen), um den CSRF-Cookie übereinstimmt.

Für diese Ansicht stammt die Postanforderung von einer anderen Domäne, die nicht über das Token verfügt, das zum Übergeben der CSRF-Prüfungen erforderlich ist. Daher müssen Sie csrf_exempt für diese Ansicht verwenden.

Verwandte Themen