Playframework mit CSRF: "CSRF-Token in Sitzung nicht gefunden"?

Ich erstelle mit Playframework ein einfaches Authentifizierungssystem mit integriertem CSRF-Filter und Security.Authenticator-System, stelle jedoch ein Problem fest:

Wenn der Benutzer sein Login / Passwort eingibt und eingibt, wird der folgende Fehler angezeigt:

CSRF-Token in Sitzung nicht gefunden

Ich habe mein Formular überprüft und das CSRF-Token ist wirklich vorhanden und richtig platziert (innerhalb des Tags)

Hier ist meinroutes :

GET     /login                      controllers.Authentication.login
POST    /login                      controllers.Authentication.authenticate

Und meinAuthentication.java class:

@play.filters.csrf.AddCSRFToken
public static Result login() {
    if (Session.getAccount() != null) {
        return redirect(controllers.routes.Instances.list());
    }

    LoginForm loginForm = new LoginForm();
    if (ctx().session().containsKey("email")) {
        loginForm.setEmail(ctx().session().get("email"));
    }

    if (request().queryString().containsKey("disconnected")) {
        flash("warning", Messages.get("secure.logout")); // TODO : Warning flash message
    }

    Form<LoginForm> form = Form.form(LoginForm.class).fill(loginForm);
    return ok(views.html.login.render(form));
}

@play.filters.csrf.AddCSRFToken
@play.filters.csrf.RequireCSRFCheck
public static Result authenticate() {
    Form<LoginForm> form = Form.form(LoginForm.class).bindFromRequest();
    if (form.hasErrors()) {
        return badRequest(views.html.login.render(form));
    }

    LoginForm login = form.get();
    Account account = Account.findByEmail(login.getEmail());

    if (account == null || !account.checkPassword(login.getPassword())) {
        form.reject("email", "secure.invalid.login");
        return badRequest(views.html.login.render(form));
    }

    String next = null;
    if (ctx().session().containsKey("next")) {
        next = ctx().session().get("next");
        if ("".equals(next)) {
            next = null;
        }
    }

    session().clear();
    session("email", login.getEmail());

    if (next != null) {
        return redirect(next);
    } else {
        return redirect(controllers.routes.Instances.list());
    }
}

Die Eigenschaften, die ich in der application.conf festgelegt habe:

csrf.token.name="csrf"
csrf.sign.tokens=true

Hier ist mein Formular (um zu zeigen, dass das Token korrekt positioniert ist):

<form action="@controllers.routes.Authentication.authenticate" method="post" class="form-vertical" role="form">
    <fieldset>
        @defining(form("email")) { element =>
        <div class="form-group fade-in two@if(element.hasErrors){ has-error}">
            <label class="control-label" for="[email protected]">Email:</label>
            <input type="email" name="@element.name" id="[email protected]" class="form-control" value="@element.value" placeholder="Enter your email" required />
            @element.errors.map { error => <span class="help-block">@play.i18n.Messages.get(error.message)</span>}
        </div>}
        @defining(form("password")) { element =>
        <div class="form-group fade-in three@if(element.hasErrors){ has-error}">
            <label class="control-label" for="[email protected]">Password:</label>
            <input type="password" name="@element.name" id="[email protected]" class="form-control" value="@element.value" placeholder="Enter your password" required />
            @element.errors.map { error => <span class="help-block">@play.i18n.Messages.get(error.message)</span>}
        </div>}
        <div class="form-group actions fade-in four">
            <div class="text-right">
                <input type="submit" name="save" value="Sign me in" class="btn btn-primary" />
                @helper.CSRF.formField
            </div>
        </div>
    </fieldset>
</form>

Update 1: Ich habe alle @ entfer@addCSRFToken und@requireCSRFToken und definierte stattdessen ein globales CSRF-Token gemäß @rhj-Empfehlung. Jetzt habe ich stattdessen diesen Fehler bekommen:

Invalid token found in form body

Aber wie Sie im HTML-Formular sehen können, wird das Token innerhalb des Formulars platziert und sollte identifiziert werden!

Update 2: Was mich am meisten stört, ist, dass dieses Problem nur auf der Anmeldeseite auftritt und nicht anderswo! Gibt es eine Sitzung, die zuerst aktiviert werden soll? Ich denke nicht aber vielleicht?!

Update 3: Seltsamerweise habe ich gerade herausgefunden, dass, wenn ich den Wert von @ ändecsrf.token.name und die Seite neu laden, es funktioniert. Wenn ich mich dann abmelde, eine neue Seite öffne und erneut versuche, mich anzumelden, schlägt dies mit der Meldung @ fehInvalid token found in form body. Wenn ich den Wert von @ wieder ändecsrf.token.name und mach es nochmal, es wird wieder funktionieren.

Update 4: Ich habe das Problem eingegrenzt. Ich verwende auch den play.mvc.Security.Authenticator und es scheint, dass die Token-Überprüfung NUR fehlschlägt, wenn ich die Seite nach einem @ anzeigredirect(). Wenn ich direkt zur Anmeldeseite gehe, wird die Fehlermeldung nicht angezeigt.

Endgültiges Update!: Ich habe endlich das Problem gefunden, es war in einer anderen Klasse, die ich nicht vermutet habe, die aufgerufen und die Sitzung beendet wurde, wodurch das Token unbrauchbar wurde!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage