Laden...

Wieso bringt eine ASP.NET Core 3.1 Anwendung beim ValidateAntiForgeryToken einen 500er Fehler?

Erstellt von Mary81 vor 3 Jahren Letzter Beitrag vor 3 Jahren 491 Views
M
Mary81 Themenstarter:in
87 Beiträge seit 2008
vor 3 Jahren
Wieso bringt eine ASP.NET Core 3.1 Anwendung beim ValidateAntiForgeryToken einen 500er Fehler?

Hallo.

Vielleicht kann mir jemand helfen. Ich entwickele gerade an einer Asp Website und kriege irgw. die Seite nicht ans laufen.
Es gibt einen AccountController der für die Anmeldung zuständig ist.

Wenn ich die Anwendung unter localhost aufrufe, dann funktioniert es. Deploye ich die Seite auf dem Server bekomme ich immer wieder die Fehlermeldung 500.

AccountController



    [ValidateAntiForgeryToken]
    public class AccountController : Controller
    {
        private readonly ILogger<AccountController> _logger;
        private SamContext _context;
        
        public AccountController(ILogger<AccountController> logger, SamContext context) 
        {
            _logger = logger;
            _context = context;
        }
        
        [HttpGet]
        public IActionResult Login()
        {
            return View();
        }
        
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult LoginPst(string email, string password)
        {
            var check = CheckUser(new LoginViewModel() { email = email, password = password });
            if (check == 1)
            {
                return Redirect("/Home/Index");
            }
            else
            {
                ViewBag.Fehler = "Die E-Mail Adresse oder das Passwort ist falsch.";
                return View("Login");
            }
        }

Login.html


@{
    ViewData["Title"] = "Login";
}

<div class="container-login">
    <br />
    <h1>Anmelden</h1>

    <br />
    <form asp-controller="Account" asp-action="LoginPst" method="post">
        @Html.AntiForgeryToken()

        <div class="form-group">
            <label for="email">E-Mail Adresse</label>
            <input type="text" class="form-control" id="email" name="email" required placeholder="E-Mail Adresse">
        </div>
        <div class="form-group">
            <label for="password">Password</label>
            <input type="password" class="form-control" id="password" name="password" required placeholder="Password">
        </div>

        @if (!String.IsNullOrEmpty(ViewBag.Fehler))
        {
        <br />
        <div class="alert alert-danger" role="alert">
            @ViewBag.Fehler
        </div>
        }
        <br />
        <button type="submit" class="btn btn-primary">Anmelden</button>

    </form>
</div>


Startup.cs


public void ConfigureServices(IServiceCollection services)
        {
            var connectionString = Configuration.GetConnectionString("DbConnectionString");
            services.AddDbContext<SamContext>(options => { options.UseSqlServer(connectionString); });
            
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
            
// ist das hier wichtig ????? 
            services.AddAntiforgery(opiton => {
                opiton.FormFieldName = "MyAntiForgeryField";
                opiton.HeaderName = "ANTI-TOKEN-HEADERNAME";
            });

            services.AddControllersWithViews();
          
            services.AddDistributedMemoryCache();
            services.AddHttpContextAccessor();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntiforgery antiforgery)
        {
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseCookiePolicy();
            app.UseAuthentication();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}");
            });
        }

Ich weiß gerade nicht was ich falsch mache. Vielleicht kann mir jemand helfen. Im Internet finde ich vieles was mit ajax aufgerufen wird und wo der header expliziert gesetzt wird. Ich wollte die Aufrufe aber so lassen. Es seiden es macht so keinen sinn die Umleitung der Seiten so zu machen!?

ForgeryToken .net core

16.807 Beiträge seit 2008
vor 3 Jahren

Weiß nicht genau was das Thema im Snippet-Bereich soll, daher hab ichs entsprechend in den richtigen Forenbereich verschoben.
Du bist seit 2008 dabei, da kann man eigentlich schon erwarten, dass man den richtigen Forenbereich verwendet => [Hinweis] Wie poste ich richtig?

Jede Error 500 Meldung hat auch einen Error Body, warum der Request fehl schlägt; quasi der Exception Text.
Ohne den raten wir im Dunkeln und wissen gar nicht, ob AF dafür verantwortlich ist oder nicht.

AddAntiforgery brauchst Du nur, wenn Du das Verhalten customizen willst.
Wenn ValidateAntiForgeryToken fehlschlägt, dann gibts eigentlich einen Error 400 und nicht 500.

Aufgrund des Http Status Code 500 denke ich, dass was anderes vermurkst ist, als der AFT.

Aber: ValidateAntiForgeryToken gehört an die Action und nicht an die Klasse.
Evtl kann dieser Fehler Error 500 auslösen; bin ich mir unsicher.

M
Mary81 Themenstarter:in
87 Beiträge seit 2008
vor 3 Jahren

Wo finde ich den Error Body? Das Projekt habe ich bei IONOS gehostet und ich kann es auch nicht debuggen. Einen Error Log habe ich leider auch nicht. Nur das Debugging vom Browser.

16.807 Beiträge seit 2008
vor 3 Jahren

Musst halt den Error loggen oder die Developer Pages aktivieren.
Handle errors in ASP.NET Core