2010-03-18 31 views
50

ASP.Net MVC 2'yi kullanarak, Controller sınıfının RedirectToAction() yöntemini AuthorizeAttribute sınıfını temel alan bir sınıf içinde kullanmanın bir yolu var mı?Özel bir AuthorizeAttribute sınıfının içinde RedirectToAction() kullanmak mümkün mü?

public class CustomAttribute : AuthorizeAttribute { 
    protected override bool AuthorizeCore(HttpContextBase context) { 
     // Custom authentication goes here 
     return false; 
    } 

    public override void OnAuthorization(AuthorizationContext context) { 
     base.OnAuthorization(context); 

     // This would be my ideal result 
     context.Result = RedirectToAction("Action", "Controller"); 
    } 
} 

ben yeniden doğrudan kullanıcıyı belirli bir kontrolör/eylem onlar giriş sayfasına geri gönderilmesi yerine kimlik doğrulaması başarısız olduğunda bir yol arıyorum. Bu kontrol birimi/eylem için oluşturulan doğrudan URL'nin olması ve RedirectResult() kullanımı mümkün mü? Sadece URL’yi kodlamak için cazip olmamaya çalışıyorum.

cevap

94

OnAuthorization yerine HandleUnauthorizedRequest geçersiz kılmanız gerekir. İşte varsayılan uygulama görebilirsiniz:

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new HttpUnauthorizedResult(); 
    } 

Sen Controller.RedirectToAction kullanamazsınız, ancak yeni RedirectToRouteResult döndürebilir.

Yani yapabilirsiniz: Başka durumda herkes yılında

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            { 
             { "action", "ActionName" }, 
             { "controller", "ControllerName" } 
            }); 
    } 
+1

Teşekkürler, bu işe yarıyor. HandleUnauthorizedRequest kullanarak iyi yakalama - OnAuthorization kullanıyordum çünkü başka bir öğretici/tartışmada gördüm (kimlik doğrulaması başarısız olduğunda yeniden ayarlanan özel bir özelliği vardı). –

+0

@LanceMcNearney Parametre filterContext'te ne geçirebilirim? – Pomster

+0

@Craig Stuntz FilterContext olarak ne geçirebilirim? – Pomster

11

Böyle bir şey yapabilirsiniz:

var routeValues = new RouteValueDictionary(); 
routeValues["controller"] = "ControllerName"; 
routeValues["action"] = "ActionName"; 
//Other route values if needed. 
context.Result = new RedirectToRouteResult(routeValues); 

Bu, kontrol cihazındaki "RedirectToAction()" dediğimiz zaman çerçevesi öyle bir yoldur.

+0

Bağlam nedir? Kırmızıyla altını çizdim mi? – Pomster

+0

@Pomster Soruyu kontrol edin, "içerik" sorusu ile ilgili yöntem için bir parametredir. –

+0

Teşekkürler, Bu işi yapmak için ne geçirilecek? Iv, bu çalışma için mücadele ediyor – Pomster

2

bu soruya ilgileniyor.

Sadece özel AuthorizeAttribute içinde küçük bir özel denetleyicisi oluşturmak: Bu (MVC 3 kullanılarak en azından MVC 2 hakkında bilmiyorum) daha basit bir şekilde çözülebilir

private class RedirectController : Controller 
    { 
     public ActionResult RedirectWhereever() 
     { 
      return RedirectToAction("Action", "Controller"); 
     } 

    } 

Bu kolayca yapabilirsiniz HandleUnauthorizedRequest yönteminde kullanılabilir (bkz. Craigs yanıtı):

filterContext.Result = (new RedirectController()).RedirectWhereever(); 
+2

'RedirectToAction' bir' RedirectToRouteResult' döndürür, @Craig Stuntz'ın yanıtladığı gibi yalnızca bir tane döndürmek için bir denetleyici oluşturmaya gerek yoktur –

İlgili konular