2017-02-23 5 views
2

Ich versuche derzeit, eine WebAPI (.NET Core) zu entwickeln, die einige Controller-Aktionen hat, die HTTP Basic Authentication verwenden sollten. Um dies zu implementieren, habe ich ein ActionFilterAttribute geschrieben, das ich dann in meinem Controller verwenden kann, um den Zugriff auf bestimmte Aktionen einzuschränken. Das alles workes gut, wenn ich so etwas tun:Wie kann ich auf AppSettings von einem ActionFilterAttribute in ASP.NET Core zugreifen

BasicAuthAttribute.cs

public class BasicAuthAttribute : ActionFilterAttribute{ 
    private string _username { get; set; } 
    private string _password { get; set; } 

    public BasicAuthAttribute(string username, string password) { 
     _username = username; 
     _password = password; 
    } 

    public override void OnActionExecuting(ActionExecutingContext actionContext) { 
    //do Auth check... 
    } 
} 

In der Steuerung Ich benutze es dann wie folgt:

SomeController.cs

[BasicAuth("testuser","testpassword")] 
[HttpGet("{id}")] 
public IActionResult Get(string id) { 
    return new ObjectResult("Test"); 
} 

Jetzt möchte ich Benutzername und Passwort in SomeController nicht angeben .cs. Stattdessen möchte ich sie in appsettings.json speichern. Wie ist es möglich, auf Werte zuzugreifen, die in appsettings.json in der OnActionExecuting-Methode im ActionFilterAttribute gespeichert sind?

Wenn ich den Konstruktor von BasicAuthAttribute zu dem folgenden ändern, erwartet .Net, dass ich die Einstellungen überlasse, was nicht möglich ist. Dependency Injection scheint hier nicht zu funktionieren.

ich auf einen Filter das Attribut zu ändern endete:

public BasicAuthAttribute(IOptions<AppSettings> appSettings) {} 

Jede Hilfe oder Ideen würde

UPDATE basierend auf Set Antwort geschätzt. Für den Fall, jemand anderes braucht es die Arbeitslösung siehe unten:

BasicAuthFilter.cs

public class BasicAuthFilter : IActionFilter{ 

protected AppSettings _settings { get; set; } 

public BasicAuthAttribute(IOptions<AppSettings> appSettings) { 
    _settings = appSettings; 
} 

public void OnActionExecuted(ActionExecutedContext context) { 
    //nothing to do here 
} 

public override void OnActionExecuting(ActionExecutingContext actionContext) { 
    //do Auth check... 
} 

}

SomeController.cs

public class SomeController : Controller { 
    [TypeFilter(typeof(BasicAuthFilter))] 
    [HttpGet("{id}")] 
    public IActionResult Get(string id) { 
     return new ObjectResult("Test"); 
    } 
} 

Antwort

0

Abschnitt Filter in ASP.NET Core documentation erklärt wie man DI benutzt:

Wenn Ihre Filter Abhängigkeiten aufweisen, auf die Sie von DI aus zugreifen müssen, gibt es mehrere unterstützte Ansätze.

  • ServiceFilterAttribute
  • TypeFilterAttribute
  • IFilterFactory implementiert auf dem Attribut
: Sie können Ihren Filter zu einer Klasse oder Aktionsmethode unter Verwendung einer der folgenden Punkte zutrifft
Verwandte Themen