J'utilise un attribut d'autorisation personnalisé pour autoriser l'accès des utilisateurs en fonction de leurs niveaux d'autorisation. J'ai besoin de rediriger les utilisateurs non autorisés (par exemple, l'utilisateur essaie de supprimer une facture sans supprimer le niveau d'accès) pour accéder à la page refusée.
L'attribut personnalisé fonctionne. Mais dans le cas d'un accès utilisateur non autorisé, rien ne s'affiche dans le navigateur.
Code du contrôleur.
public class InvoiceController : Controller
{
[AuthorizeUser(AccessLevel = "Create")]
public ActionResult CreateNewInvoice()
{
//...
return View();
}
[AuthorizeUser(AccessLevel = "Delete")]
public ActionResult DeleteInvoice(...)
{
//...
return View();
}
// more codes/ methods etc.
}
Code de classe d'attribut personnalisé.
public class AuthorizeUserAttribute : AuthorizeAttribute
{
// Custom property
public string AccessLevel { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // Call another method to get rights of the user from DB
if (privilegeLevels.Contains(this.AccessLevel))
{
return true;
}
else
{
return false;
}
}
}
Appréciez si vous pouvez partager votre expérience à ce sujet.
Vous devez remplacer le HandleUnauthorizedRequest
comme spécifié ici .
public class CustomAuthorize: AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
base.HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" }));
}
}
}
** Remarque: déclaration conditionnelle mise à jour en janvier 2016