Laden...

ASP.NET MVC (Umstellung .NET FRAMEWORK -> CORE) AccountController & ActionFilterAttribute

Letzter Beitrag vor einem Jahr 5 Posts 622 Views
ASP.NET MVC (Umstellung .NET FRAMEWORK -> CORE) AccountController & ActionFilterAttribute

Hallo!

Ich konnte in meiner bisherigen ASP.NET MVC .NET Framework Webanwendungmeinen AccountController mit einem ActionFilterAttribute ausstatten und/oder von einem BaseController erben lassen. (In diesen ActionFilterAttributen habe ich bisher bsp. CannonicalUrl, EuCookies und Spracheinstellungen usw. gesteuert).

AccountController.cs:

        //
        // GET: /Account/Login
        [AllowAnonymous]
        [CanonicalURL("/account/login")]
        [EuCookie]
        public ActionResult Login(string returnUrl)       
             ...

Ich konnte meiner neuen ASP.NET MVC CORE Webanwendung (mittels Gerüstelementen ) die Login, Register, ResetPassword Seiten hinzufügen und wie gewohnt anpassen aber mir fehlt der AccountController für meine bisher ActionFilterAttribute.

Kann mir hier jemand einen Tipp für einen Lösungsansatz geben?

Lg Toni

Es gibt in den neuen Templates keine Controller für Identity mehr, weil alles (leider) über Razor Pages funktioniert.
Siehe Docs: Scaffold Identity in ASP.NET Core projects
Willst nen Controller, musst das alles selbst machen, was weiterhin geht. Aber die Templates nutzen halt kein MVC mehr. 
Templates sind aber halt auch immer nur Beispiele - niemand zwingt Dich das zu nutzen, wenn es für Dich nicht passt. Schreib die Controller einfach selbst.

Solltest unbedingt mal die ASP.NET Core Docs überfliegen, bevor Du migrierst. Ansonsten werden sehr viele Stellen schwierig für Dich nachzuvollziehen.

Hallo!

Wäre es ein akzeptabler/brauchbarer Ansatz, wenn man die bisherigen Funktionen dieser ActionFilterAttribute einfach in eine statische Klasse schreibt und dann im Controller + in diesen Areas/Identiy/Pages/Account/XXXXX.cshtml.cs verwendet?

HomeController.cs:

        public IActionResult Index()
        {
            // #####################################################################################################################
            // ## EuCookie & CannonicalUrl & Sprachauswahl
            // #####################################################################################################################
            dz.EuCookieService.UseEuCookie(this.ViewData, this.Request);
            dz.CanonicalUrlService.UseCanonicalUrl(this.ViewData, this.Request, "/");
            dz.SprachauswahlService.UseSprachauswahl(this.ViewData, this.Request);
            // #####################################################################################################################

            return View();
        }

Areas/Identiy/Pages/Account/Login.cshtml.cs

		public async Task OnGetAsync(string returnUrl = null)
        {
            ...

            // #####################################################################################################################
            // ## EuCookie & CannonicalUrl & Sprachauswahl
            // #####################################################################################################################
            dz.EuCookieService.UseEuCookie(this.ViewData, this.Request);
            dz.CanonicalUrlService.UseCanonicalUrl(this.ViewData, this.Request, "/identity/account/login");
            dz.SprachauswahlService.UseSprachauswahl(this.ViewData, this.Request);
            // #####################################################################################################################
        }

Es scheint soweit auf jeden fall perfekt zu klappen. Ich bin mir nur nicht sicher ob ich hier wieder einen "Workaround" einschlage der nicht empfehlenswert ist...

Hier noch was beispielsweise mein UseCanonicalUrl macht:

public static class CanonicalUrlService
    {
        #region Methods
        public static void UseCanonicalUrl(ViewDataDictionary viewData, HttpRequest request, string subdirectory)
        {
            var host = request.Host.Value;
            var full = $"https://{host}{subdirectory}";
            var canonical = $"<link rel='canonical' href='{full}' />";
            viewData["CannonicalURL"] = canonical;
        }
        #endregion
    }

Lg Toni

Auch wenns vielleicht funktionieren mag, aber damit untergräbst die Idee von Middlewares in ASP.NET Core.
Dadurch hast Seiteneffekte und zB das Testen wird komplexer.

ASP.NET Core hat zb eine DSGVO-konformes Cookie-Behavior direkt integriert, wozu was eigenes machen, das evtl. nicht konform ist.
Integrierte Services von ASP.NET Core verwenden auch das integrierte Cookie Behavior.

Für das ganze Zeug, Canonical etc... würde man einfach die Templating-Funktion von Razor verwenden.
Das heisst, dass das in den Views definiert wird, nicht in den Actions.

Beispiel des Forencodes:

// Layout.cshtml
    @if (ViewData.TryGetCanonicalUrl(out var canonicalUrl))
    {
        <link rel="canonical" href="@(canonicalUrl)" />
    }
    
// MyView.cshtml
var currentUrl = Router.ToForumThreadView(thread.Id, thread.Topic, currentPage);
ViewData.AddCanonicalUrl(currentUrl, Context);

Und damit brauchst den ganzen Overhead-Krams nicht.
Kann so einfach sein, wenn man die eingebauten Funktionen von ASP einfach verwendet.

Super vielen Dank für deinen Tipp!!