Domanda

La mia classe Controller è decorata con un AuthorizeAttribute per proteggere le azioni:

[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
    ...
}

Ogni volta che viene invocata un'azione ma l'utente non ricopre almeno il ruolo "Livello utente 2" viene automaticamente reindirizzato alla pagina di accesso con un URL come questo:

http: // localhost: 1436 / Account / Login? ReturnUrl =% 2fBuy

Se l'utente ha già effettuato l'accesso, ma non ha il giusto livello di sicurezza, questo non è un comportamento ottimale! Sarebbe più sensato visualizzare una pagina che informa l'utente del livello mancante invece di mostrare la pagina di accesso.

Cosa posso fare per personalizzare questo comportamento? È possibile in qualche modo passare il livello utente richiesto all'azione Login?

È stato utile?

Soluzione

Puoi creare il tuo attributo autorizzare in questo modo:

public class ClubAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
  base.OnAuthorization(filterContext);
  if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult)
  {
    filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {
      { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] },
      { "controller", "Account" },
      { "action", "Login" },
      { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
    });
  }
}
}

L'ho usato per reindirizzare a un club specifico in un sito di appartenenza al club che sto costruendo. Potresti adattare questo ai tuoi bisogni. A proposito, nel mio caso reindirizzo alla pagina di accesso, ma controllo per vedere se l'utente è autorizzato e, in tal caso, visualizzo un messaggio che non hanno le autorizzazioni corrette. Senza dubbio potresti anche aggiungere qualcosa a ViewData o TempData da visualizzare sulla pagina, ma non l'ho provato

Modifica AuthorizationContext.Cancel non esiste più in RC. " filterContext.Result è HttpUnauthorizedResult " sembra essere abbastanza: Che cosa è successo a filterContext.Cancel ( ASP.NET MVC)

Altri suggerimenti

Il tempo è passato dall'ultima risposta.

Dal 2009 sono stati fatti molti progressi nello spazio delle autorizzazioni. In particolare, OASIS (quelli dietro SAML) hanno standardizzato XACML, l'eXtensible Access Control Markup Language.

XACML offre agli sviluppatori:

  • un modello di utilizzo
  • un'architettura
  • un linguaggio flessibile delle politiche di autorizzazione

XACML è in linea con il controllo degli accessi basato sugli attributi che NIST raccomanda di adottare oggi nelle applicazioni.

Dai un'occhiata a questa rispondi per maggiori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top