2013-04-30 24 views
12

'u kullanırken ReturnUrl parametresini ayarlar Bir ASP.NET MVC projesinde, bir sınıfı veya yöntemi [Authorize] ile süslediğinizde ve yetkilendirme başarısız olduğunda, site otomatik olarak oturum açma sayfasına yönlendirilir (web'de belirtilen loginUrl kullanılarak) .Config). Ayrıca, ASP.NET MVC çerçevesindeki bir şey orijinal isteğin URL'sini bir ReturnUrl parametresi olarak geçirir.İlk olarak AuthorizeAttribute

Bu ReturnUrl'in eklenmesinden sorumlu olan nedir? Proje şablonunda bunun için herhangi bir kod bulamadım. Ayrıca, ASP.NET yığınının source code'daki AuthorizeAttribute koduna da bir göz attım ama orada hiçbir şey bulamadım. Ayrıca "returnurl" için tüm ASP.NET yığın kaynak kodunu aramayı denedim, ancak hiçbir şey bulamadım.

Sormamın nedeni, bu işlemde bir hata keşfettiğimdi. Bunu yeni bir İnternet ASP.NET MVC projesi ile görebilirsiniz. FormsAuth zaman aşımını web.config dosyasında 1 dakikaya ayarlayın ve ardından oturum açın. Bir dakika bekleyin ve çıkış yapmayı deneyin. Bu giriş yaptıktan sonra 404 yol açar/hesap/kapatma bir ReturnUrl ile giriş sayfasına yönlendirir Kendi AuthorizeAttribute ile şimdilik bu çevrede çalıştık. Ancak

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      string returnUrl = null; 
      if (filterContext.HttpContext.Request.HttpMethod.Equals("GET", System.StringComparison.CurrentCultureIgnoreCase)) 
       returnUrl = filterContext.HttpContext.Request.RawUrl; 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary() 
      { 
       { "client", filterContext.RouteData.Values[ "client" ] }, 
       { "controller", "Account" }, 
       { "action", "Login" }, 
       { "ReturnUrl", returnUrl } 
      }); 
     } 
    } 
} 

, ben istiyorum Kaynağa bir göz atıp, bu hatanın varlığını anlayabiliyor muyum, eğer gerçekten bir böcekse.

+0

Sadece MVC'ye özgü olmayan form kimlik doğrulamasının bir parçası olduğunu düşünüyorum. Dönüş URL'si WebForm'da da bulunmaktadır. – Devesh

+0

Bu olabilir - MVC ad alanı içinde AuthorizationAttribute olduğundan ve OnAuthorization'ı (yukarıda gösterildiği gibi) geçersiz kıldığından beri MVC ile ilgili bir şey var gibi görünüyor. –

+0

http://msdn.microsoft.com/en-us/library/ff647070.aspx, size yardımcı olabilir – Devesh

cevap

10

returnUrl querystring parametresi System.Web.dll derlemesindeki FormsAuthentication sınıfının içindeki giriş sayfasına yönlendirmeye eklenir. FormsAuthenticion.RedirectToLoginPage yöntemi aşırı yükleme, iç yöntemi GetLoginPage'i çağırmayı sonlandırır. "ReturnUrl" değişkeninin adı ve LoginUrl, web.config ayarları aracılığıyla geçersiz kılınabilir.

varsayılan AuthorizeAttribute yetkisiz bir isteği karşılaştığında

, sadece FormsAuthenticationModule perde arkasında devreye giriyor ve işin gerisini, 401 durum koduyla HttpStatusCodeResult etrafında sarıcı olan bir HttpUnauthorizedResult döndürür. FormsAuthentication sınıfı statik yöntemlerini doğrudan çağırmıyorsanız, MVC ve bu temel sınıflar arasında doğrudan etkileşim yoktur.

Bu davranışı geçersiz kılmak istediğinizde çözümünüz standarttır. aşağıdaki gibi

çalışır GetLoginPage yöntemidir:

internal static string GetLoginPage(string extraQueryString, bool reuseReturnUrl) 
{ 
    HttpContext current = HttpContext.Current; 
    string loginUrl = FormsAuthentication.LoginUrl; 
    if (loginUrl.IndexOf('?') >= 0) 
    { 
     loginUrl = FormsAuthentication.RemoveQueryStringVariableFromUrl(loginUrl, FormsAuthentication.ReturnUrlVar); 
    } 
    int num = loginUrl.IndexOf('?'); 
    if (num >= 0) 
    { 
     if (num < loginUrl.Length - 1) 
     { 
      loginUrl = string.Concat(loginUrl, "&"); 
     } 
    } 
    else 
    { 
     loginUrl = string.Concat(loginUrl, "?"); 
    } 
    string str = null; 
    if (reuseReturnUrl) 
    { 
     str = HttpUtility.UrlEncode(FormsAuthentication.GetReturnUrl(false), current.Request.QueryStringEncoding); 
    } 
    if (str == null) 
    { 
     str = HttpUtility.UrlEncode(current.Request.RawUrl, current.Request.ContentEncoding); 
    } 
    loginUrl = string.Concat(loginUrl, FormsAuthentication.ReturnUrlVar, "=", str); 
    if (!string.IsNullOrEmpty(extraQueryString)) 
    { 
     loginUrl = string.Concat(loginUrl, "&", extraQueryString); 
    } 
    return loginUrl; 
} 
İlgili konular