Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Blazor Server AuthorizeRouteView
pixfreak
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

Blazor Server AuthorizeRouteView

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10072

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
pixfreak
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 355
Herkunft: Kassel

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
pixfreak
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers