I am working on a web project based on Asp.Net MVC and Aurelia and I decided to structure it with part MVC and part Spa (Aurelia). The project also implements a basic authentication system (Asp.Net Core Identity) where if a non-authenticated user is trying to access a secure page it is redirected to the login page, which is standard procedure in these cases.
As you can see the return URL sent in with the query string includes a fragment, used by the Aurelia routing (or any spa framework routing you are using):
http://localhost:14500/Auth/Login?ReturnUrl=%2Fcamp%2F7#sessions
The problem is that the fragment portion of the URL is never sent to the server and it is therefore ignored. So here is what happens:
The fragment of the URL is not being added to the action url of the form, so when you post the login form the server redirects to a URL without fragment and you are not able to get to the correct page handled by the spa router.
So, I included a little Javascript functions that picks up the return URL from the browser’s location.href and updates the form action with the correct return URL:
$(document).ready(function () {
var form = $("form")[0];
var hash = document.location.hash;
if (hash) {
if (form) {
if (form.action) {
form.action = document.location.href;
}
}
}
});
Here is how the form action looks like after this code runs:
Now, when the user logs in and the server redirect to the originally requested URL, Aurelia router picks it up and renders the correct page.