Injecter en Action le service de Filtre
Je suis en train d'injecter un service dans mon action de filtre mais je ne suis pas d'obtenir les services requis injecté dans le constructeur. Voici ce que j'ai:
public class EnsureUserLoggedIn : ActionFilterAttribute
{
private readonly ISessionService _sessionService;
public EnsureUserLoggedIn()
{
//I was unable able to remove the default ctor
//because of compilation error while using the
//attribute in my controller
}
public EnsureUserLoggedIn(ISessionService sessionService)
{
_sessionService = sessionService;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
//Problem: _sessionService is null here
if (_sessionService.LoggedInUser == null)
{
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Result = new JsonResult("Unauthorized");
}
}
}
Et je suis la décoration de mon contrôleur comme suit:
[Route("api/issues"), EnsureUserLoggedIn]
public class IssueController : Controller
{
}
De démarrage.cs
services.AddScoped<ISessionService, SessionService>();
- Les attributs de décorations permet seulement des valeurs constantes. Je suppose que vous devez résoudre votre service dans le constructeur par défaut.
- Je ne suis pas sûr de savoir comment cela est possible dans ce scénario.
- Jetez un oeil ici, je suppose que vous avez seulement besoin d'un décorateur
- J'ai une solution qui fonctionne pour ce - que je suis à jour pour ASP.NET de Base. J'espère que je vais avoir quelque chose dans quelques minutes.
- Au lieu de tenter d'injecter des services dans les attributs, écrire passive attributs.
- Vous ne devriez pas mettre en œuvre vos propres filtres ou les attributs d'autorisation autorisation/de la politique. C'est ce que la politique du générateur et de la Politique de la propriété de
AuthoirzeAttribute
. Voir cette réponse à partir d'un ASP.NET Développeur responsable de la sécurité des pièces de ASP.NET Core stackoverflow.com/a/31465227/455493
Vous devez vous connecter pour publier un commentaire.
À l'aide de ces articles de référence:
ASP.NET de Base d'Action des Filtres
L'Action des filtres, un filtre et les filtres dans ASP.NET 5 et 6 MVC
En utilisant le filtre de ServiceFilter
Parce que le filtre sera utilisé comme un
ServiceType
, il doit être enregistré avec le cadre du Cio. Si l'action des filtres ont été utilisés directement, ce ne serait pas nécessaire.De démarrage.cs
Filtres personnalisés sont ajoutés à la MVC méthode de contrôleur et le contrôleur de classe à l'aide de la
ServiceFilter
attribut de la sorte:Il y avait d'autres exemples de
À l'aide du filtre comme un filtre global
En utilisant le filtre de base des contrôleurs de
À l'aide du filtre avec une commande
Prendre un coup d'oeil, de leur donner un essai et voir si cela résout votre problème.
Espère que cette aide.
AuthorizeAttribute
avec les politiques que vous avez configuré sur démarrage de l'application. Vérifier mon commentaire ci-dessusFiltres globaux
Vous avez besoin pour mettre en œuvre
IFilterFactory
:Dans
Startup
classe au lieu d'enregistrer un filtre réel de l'inscription de votre filtre factory:D'une façon de plus pour la résolution de ce problème. Vous pouvez obtenir votre service à partir du Contexte comme dans le code suivant:
Veuillez noter que vous devez vous inscrire à ce service en Démarrage.cs
Après la lecture de cet article ASP.NET de Base - dans le Monde Réel ASP.NET Core, MVC Filtres (Août 2016) j'ai mis en place comme ceci:
Dans Starup.cs /ConfigureServices:
Dans MyFilterAttribute.cs:
Dans MyFooController.cs :
Edit: Passage d'arguments comme
[MyFilter("Something")]
peut être fait en utilisant les Arguments de la propriété de la TypeFilterAttribute classe: Comment puis-je ajouter un paramètre à une action de filtre dans asp.net? (rboe code montre également comment injecter les choses (de la même façon))Exemple
Espère que cela aide.
Alors que la question implicitement fait référence à des "filtres via les attributs", il est néanmoins important de souligner que l'ajout de filtres "à l'échelle mondiale par type de" prise en charge de DI out-of-the-box:
En ce qui concerne l'attribut de base de filtres:
Toutefois, comme mentionné dans les réponses précédentes à l'OP, il y a des façons d'indirection qui peut être utilisé pour obtenir des DI. Par souci d'exhaustivité, voici les liens vers les docs officielles: