Laden...

Blazor Server AuthorizeRouteView

Erstellt von pixfreak vor 2 Jahren Letzter Beitrag vor 2 Jahren 522 Views
P
pixfreak Themenstarter:in
36 Beiträge seit 2013
vor 2 Jahren
Blazor Server AuthorizeRouteView

Moin,

ich beschäftige mich mit asp.net core Identity und Blazor Server und baue gerade ein Login. welches direkt als Komponente läuft und nicht die MVC Templates benutzt. Soweit so gut. Ich hänge an einem Punkt fest: Wie verhindere ich, dass ein nicht authorisierter Benutzer auf Seiten kommt, wo er nicht hin soll, ohne überall ein Authorize-Attrubute oder eine AthorizeView plazieren zu müssen.

Ich nehme mal als Beispiel das originale Visual Studio Blazor Server Template aus der aktuellen Version mit individuellen Nutzeraccounts. Dort finde ich in der app.razor die AuthorizeRouteView. Laut verschiedenen Docs kann ich dort in dem NotAuthorized Property einen Text etc. zum rendern angeben, wenn der Benutzer nicht authorisiert ist. Ich verstehe es so, wenn autorisiert dann folge ich der Route, wenn nicht, wird dieser Part geliefert. Hier mal die app.razor wie aus dem Template, nur habe ich <NotAuthorized>Hey, not auth</NotAuthorized> eingefügt.


<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>Hey, not auth</NotAuthorized>
            </AuthorizeRouteView>

        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

Aber egal ob ich angemeldet bin oder nicht, es wird immer der Route gefolgt und nicht dieser alternaitve Text angezeigt. Dort wäre ja auch der richtige Platz für ein Redirect auf die Login-Komponente.

In der Doku finde ich dazu keinen Hinweis. Als Workaround: Füge ich in _Imports.razor am Ende ein


@attribute [Authorize]

ein, dann läuft es wie erwartet. Nur kommt mir dieser Weg irgendwie wenig elegant vor.

Wo habe ich da meinen Denkfehler?

VG

F
10.010 Beiträge seit 2004
vor 2 Jahren

Jede Route muss anzeigen ob sie Authorised sein möchte, also muss das Attribut auf jede Seite wo du eben den anderen Weg angezeigt haben möchtest.
Alles was in der _Imports steht, gilt für alle Routes im selben Verzeichnis und dadrunter.

P
pixfreak Themenstarter:in
36 Beiträge seit 2013
vor 2 Jahren

Moin FZelle,

danke für Deine Antwort. Ich habe das jetzt eben mal unter einem anderen Blickwinkel gesehen, man könnte auch sagen AthorizeRouteView ist so wie AthorizeView zu betrachten, halt nur für die Route, und damit macht das Athorize-Attribute auch Sinn.

Zumindest funktioniert das mit dem Attribute in der Imports-Datei und meine Login-Komponente hat das AllowAnnonymous-Attribut bekommen und alles ist erst einmal fein.

VG

P
441 Beiträge seit 2014
vor 2 Jahren

Erstelle dir Basiskomponenten und lasse die tatsächlichen Komponenten davon erben.
So kannst du Sachen, die du immer Injected haben willst und Attribute, die du immer haben willst direkt einmal einbauen und dann verwenden.

MyComponentBase --> Erbt von ComponentBase
Hier kannst du Property Injection nutzen, für alles was du benötigst

MyAuthorizedComponentBase --> Erbt von MyComponentBase
hat das Authorize Attribut.

P
pixfreak Themenstarter:in
36 Beiträge seit 2013
vor 2 Jahren

Moin,

ja das ist ein guter Gedanke. Ich hatte die Tage schon im Resharper mir ein Template für eine Component angelegt, die mir gleich eine Codebehind Datei mit erstellt, das fehlt im Lieferumfang und ich mag diese Vermischung nicht so... Da kann ich gleich nochmals die Vererbung mit aufnehmen, da ich auch schon an eine eigen Basis-BaseComponent für meine Bedürfnisse gedacht habe...

VG