Wynikiem rozmowy AJAX nadal będzie prawdopodobnie skończyć pojawiające się sukcesem (choć nie martw się, to nie będzie właściwie wykonywać swoje metody działania), oraz wywołaj swój uchwyt success
. Dzieje się tak dlatego, że oczekujesz kodu HTML i to właśnie otrzymujesz (chociaż wynikowy kod HTML jest prawdopodobnie Twoją stroną logowania, a nie żądanym kodem HTML). Na marginesie, jeśli oczekiwałeś JSON (używając dataType:'JSON'
), wywołałoby to błąd, ponieważ parsował HTML jako JSON.
Należy uniemożliwić FormsAuth przekierowanie strony logowania do żądań AJAX. Teraz AuthorizeAttribute
wiernie zwraca NotAuthorizedResult
, która wysyła do klienta nieautoryzowaną odpowiedź HTTP 401, która jest idealna dla klienta AJAX.
Problem polega na tym, że moduł FormsAuth sprawdza kod stanu, a jeśli jest to 401, wykonuje przekierowanie. Mam zwalczać ten problem w następujący sposób:
1) Utwórz własny typ pochodny z AuthorizeAttribute
że umieszcza flagę w HttpContext.Items
aby dać mi znać, autoryzacja nie powiodła się, a powinno wymusić 401 zamiast przekierowania:
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
/// <summary>
/// Processes HTTP requests that fail authorization.
/// </summary>
/// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true;
base.HandleUnauthorizedRequest(filterContext);
}
}
2) Dodaj do Global.asax.cs:
protected void Application_EndRequest(Object sender, EventArgs e)
{
if (Context.Items["AjaxPermissionDenied"] is bool)
{
Context.Response.StatusCode = 401;
Context.Response.End();
}
}
3) Dodać do obsługi StatusCode konfiguracji jQuery AJAX:
$.ajaxSetup({
statusCode: {
401: function() {
window.location.href = "path/to/login";
}
}
});
4) Zmień kontrolerów lub czynności, gdzie chcesz to zachowanie z użyciem AuthorizeAttribute
do AjaxAuthorizeAttribute
:
[AjaxAuthorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
objEmpMain.FirstName = firstName;
objEmpMain.LastName = lastName;
objEmpMain.Initial = Initial;
objEmpMain.Address1 = Address;
...
...
...
}
Właściwie moja obecna klasa wygląda następująco "public class EmployeeController: Controller". Czy chcesz poinstruować mnie, aby zmienić tak, jak po "publicznej klasie AjaxAuthorizeAttribute: AuthorizeAttribute" ???? –
Po prostu zamień 'AuthorizeAttribute' na' AjaxAuthorizeAttribute', który udekorowałeś na swoich kontrolerach lub działaniach kontrolera. Zobacz # 4, które właśnie dodałem. – HackedByChinese
Przepraszam, czy możesz mi wyjaśnić, gdzie muszę utworzyć klasę "public class AjaxAuthorizeAttribute: AuthorizeAttribute" ?? –