hala olasılıkla başarılı görünen sona erecek AJAX çağrı sonucu, (merak etmeyin, her ne kadar, aslında eylem yöntemini yürütmek olmaz) ve senin success
işleyicisini çağır. Bunun nedeni HTML’yi beklemeniz ve aldığınız şeydir (sonuçta ortaya çıkan HTML büyük olasılıkla giriş sayfanızdır ve istediğiniz HTML’dir). Bir kenara göre, JSON (dataType:'JSON'
kullanarak) beklediyseniz, bir hata tetikleyecektir, çünkü HTML'yi JSON olarak ayrıştırmaktadır.
Yapmanız gereken şey, FormsAuth'ın AJAX istekleri için giriş sayfasını yeniden yönlendirmesini önlemektir. Artık, AuthorizeAttribute
, AJAX istemciniz için ideal olan, istemciye bir HTTP 401 Yetkilendirilmemiş yanıtı gönderen bir NotAuthorizedResult
döndürür.
Sorun, FormsAuth modülünün StatusCode'u denetlemesi ve eğer 401 ise, yönlendirmeyi gerçekleştirmesidir. Ben bu şekilde bu sorunu konusunda mücadele ettik:
1) AuthorizeAttribute
benim kendi türev türünü oluşturma bana yetkilendirme başarısız bildirmek için HttpContext.Items
bir bayrak yerleştirir ve bir yönlendirme yerine 401 zorlamak olmalıdır:
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) sizin Global.asax.cs ekleyin:
protected void Application_EndRequest(Object sender, EventArgs e)
{
if (Context.Items["AjaxPermissionDenied"] is bool)
{
Context.Response.StatusCode = 401;
Context.Response.End();
}
}
3) jQuery AJAX kurulum için bir statusCode işleyicisi ekleyin:
$.ajaxSetup({
statusCode: {
401: function() {
window.location.href = "path/to/login";
}
}
});
4) AuthorizeAttribute
AjaxAuthorizeAttribute
kullanarak bu davranışı istediğiniz denetleyicileri veya eylemleri değiştirin:
[AjaxAuthorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
objEmpMain.FirstName = firstName;
objEmpMain.LastName = lastName;
objEmpMain.Initial = Initial;
objEmpMain.Address1 = Address;
...
...
...
}
Aslında benim şu anki sınıfım "public class EmployeeController: Controller" gibi görünüyor. Aşağıdaki "public class AjaxAuthorizeAttribute: AuthorizeAttribute" gibi değişmemi mi söylüyorsunuz ???? –
Sadece "AjaxAuthorizeAttribute" için "AuthorizeAttribute" işlevini denetleyicilerinizde veya denetleyici eylemlerinizde dekore ettiniz. Yeni eklediğim # 4'e bakın. – HackedByChinese
Maalesef, "public class AjaxAuthorizeAttribute: AuthorizeAttribute" sınıfını nerede oluşturacağımı açıklayabilir misiniz ??? –