Frage .NET Core API-Attribute für die bedingte Authentifizierung für Entwicklung und Produktion


Lange Rede, kurzer Sinn: Ist es möglich, ein umweltbasiertes Autorisierungsattribut auf meiner API zu platzieren, sodass die Autorisierungseinschränkung während der Entwicklung deaktiviert und in der Produktion wieder aktiviert wird?

Ich habe ein separates Angular 2-Projekt, das ich als .NET Core API bezeichnen möchte. Wir haben ein separates Projekt erstellt, um das Angular 2-Projekt in vscode zu öffnen und das Typoskript zu debuggen. Wenn wir fertig sind, werden wir das Projekt erstellen und aus Sicherheitsgründen in das .NET Core-Projekt einfügen.

Unser Problem ist, dass wir während der Debugging-Phasen keine Verbindung zur API herstellen können, da es sich um zwei separate Projekte handelt und unser Angular 2-Projekt kein Active Directory hat. Das .NET Core-Projekt verfügt derzeit über Authentifizierungsattribute und lässt keinen Zugriff (401) auf die API zu. Es wäre schön, wenn wir das während der Entwicklung und während der Produktion abschalten könnten.

Ich bin auch offen für weitere Vorschläge, wie wir dieses Problem am besten lösen können.

[Authorize: (Only in Production)] <-- // something like this???
[Route("api/[controller]")]
public class TestController : Controller
{
    ...

7
2018-01-10 20:03


Ursprung


Antworten:


Die ASP.NET Core-Autorisierung basiert auf Richtlinien. Wie Sie vielleicht gesehen haben, die AuthorizeAttribute kann einen Richtliniennamen annehmen, damit er weiß, welche Kriterien erfüllt sein müssen, damit die Anforderung autorisiert werden kann. Ich schlage vor, dass Sie den großartige Dokumentation zu diesem Thema.

Zurück zu Ihrem Problem, es sieht so aus, als ob Sie keine bestimmte Richtlinie verwenden, daher wird die Standardrichtlinie verwendet erfordert, dass der Benutzer authentifiziert wird standardmäßig.

Sie können dieses Verhalten in ändern Startup.cs. Wenn Sie sich im Entwicklungsmodus befinden, können Sie die Standardrichtlinie neu definieren, so dass sie keine Anforderungen enthält:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(x =>
    {
        // _env is of type IHostingEnvironment, which you can inject in
        // the ctor of Startup
        if (_env.IsDevelopment())
        {
            x.DefaultPolicy = new AuthorizationPolicyBuilder().Build();
        }
    });
}

Aktualisieren

im1dermike erwähnt in einem Kommentar, dass ein AuthorizationPolicy benötigt mindestens eine Anforderung, wie wir sehen können Hier. Dieser Code wurde vor kurzem nicht eingeführt und bedeutet, dass die obige Lösung die ganze Zeit unterbrochen war.

Um dies zu umgehen, können wir weiterhin die RequireAssertion Methode von AuthorizationPolicyBuilder und fügen Sie eine Dummy-Anforderung hinzu. Dies würde wie folgt aussehen:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(x =>
    {
        // _env is of type IHostingEnvironment, which you can inject in
        // the ctor of Startup
        if (_env.IsDevelopment())
        {
            x.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAssertion(_ => true)
                .Build();
        }
    });
}

Dies stellt sicher, dass wir mindestens eine Anforderung in der Autorisierungsrichtlinie haben, und wir wissen, dass sie immer bestehen wird.


12
2018-01-10 21:48



Persönlich würde ich meine Entwicklungsumgebung so nahe wie möglich auf prd einrichten. Jedes Mal, wenn ich etwas nur in Dev mache, hasse ich mich später dafür.

Verwenden Sie die Windows-Authentifizierung? Wenn der Api mit der Windows-Authentifizierung läuft, wird der Identitätsbenutzer über die angle2-App auf den API zugreifen. Daher sollte die Angular2-App kein Active Directory benötigen.

Aber wenn Sie ein benutzerdefiniertes AuthorizeAttribute erstellen möchten, wie es vorgeschlagen wurde. Sie können so etwas tun.

public class CustomAuthorize : AuthorizationFilterAttribute, IAuthorizationFilter
{

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        bool devEnvironment = GetEnvironment();

        if (devEnvironment)
            return;
        else
            base.OnAuthorization(actionContext);


    }

    public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
                    bool devEnvironment = GetEnvironment();

        if (devEnvironment)
            return;
        else
            base.OnAuthorization(actionContext);
    }

    private bool GetEnvironment(HttpActionContext actionContext, bool access)
    {
        // code that will tell you if you are in your dev environment or not
    }
}

Dann verwenden Sie in Ihrem Controller nur das Attribut [CustomAuthorize].


2
2018-01-10 21:53