2013-07-10 6 views
5

Ho un'azione chiamata ForgetPassword. Ogni volta che un anonimo tenta di recuperare l'azione viene reindirizzato alla Pagina di accesso. Di seguito sono le mie implementazioni.Permetti ad Anonymous di chiamare determinate azioni in asp.net mvc 3

public ActionResult ForgotPassword(string UserName) 
{ 
    //More over when i place a breakpoint for the below line 
    //its not even getting here 
    return View("Login"); 
} 

E qui è una parte del mio file web.config

<location path=""> 
     <system.web> 
      <authorization> 
      <deny users="?"/> 
      </authorization> 
     </system.web>  
     </location> 

    <location path="Content"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web>  
    </location> 

    <location path="Scripts"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web>  
    </location> 

    <location path="Images"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web>  
    </location> 

<authentication mode="Forms"> 
    <forms loginUrl="/Home/Login" timeout="5" slidingExpiration="false" /> 
</authentication> 
+0

Hai decorato il tuo 'Controller/Azione' con l'attributo' Autorizza', o registrato un filtro globale 'Autorizza'? – haim770

risposta

8

Come si nega a tutti dall'applicazione utilizzando.

<authorization> 
    <deny users="?"/> 
</authorization> 

IMHO, non si deve usare web.config per controllare l'autenticazione della vostra applicazione, invece di utilizzare l'attributo Authorize.

Aggiungi questo nel file Global.asax sotto RegisterGlobalFilters metodo

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); //Added 
} 

o si può decorare anche il controller con [Authorize]

[Authorize] 
public class HomeController : Controller 
{ 
    ... 
} 

Se si utilizza ASP.NET MVC4, per l'azione che richiedono Anonimo accesso uso AllowAnonymous attributo

[AllowAnonymous] 
public ActionResult ForgotPassword() { 
    //More over when i place a breakpoint for the below line 
    //its not even getting here 
    return View("Login");; 
} 

Come da Reference, non è possibile utilizzare i file di routing o web.config per proteggere l'applicazione MVC. L'unico modo supportato per proteggere l'applicazione MVC consiste nell'applicare l'attributo Authorize a ciascun controller e utilizzare il nuovo attributo AllowAnonymous nelle azioni di accesso e registrazione. Prendere decisioni di sicurezza basate sull'area corrente è una cosa molto brutta e aprirà la tua applicazione alle vulnerabilità.

+4

AllowAnonymous funziona in MVC 3? Non lo penso. Ecco cosa ha chiesto il proprietario del post. – user20358

0

Se si utilizza ASP.NET MVC4 si può provare a mettere attributo AllowAnonymous sulla vostra azione in questo modo:

[AllowAnonymous] 
public ActionResult ForgotPassword(string UserName) 
{ 
    //More over when i place a breakpoint for the below line 
    //its not even getting here 
    return View("Login"); 
} 

Per maggiori informazioni date un'occhiata alle articolo di Jon Galloway: Global authentication and Allow Anonymous

1

Presumo che tu stia impostando un attributo "Autorizza" sul controller, che imporrà il login per ogni azione del controller. Si consiglia di rimuovere quell'attributo dal controller e impostarlo su ciascuna azione una alla volta. o esegui l'aggiornamento a MVC 4 e utilizza l'attributo AllowAnonymous.

2

Da questo link: http://weblogs.asp.net/jongalloway/asp-net-mvc-authentication-global-authentication-and-allow-anonymous

Se si utilizza MVC 3 non si può fare:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); 
} 

Perché è globale e AllowAnonymous attributo non funziona su MVC 3.

Quindi è necessario creare il proprio filtro. Funziona per me (MVC 3), è possibile controllare la soluzione completa here.

using System.Web.Mvc; 
using MvcGlobalAuthorize.Controllers; 

namespace MvcGlobalAuthorize.Filters { 
    public sealed class LogonAuthorize : AuthorizeAttribute { 
     public override void OnAuthorization(AuthorizationContext filterContext)   { 
      bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
    } 
}