Problem:
der User wird beim Aufruf einer Webseite nicht erkannt, obwohl das Login erfolgreich war
Betrifft: Asp.Net Core MVC Anwendung mit WebApi JWT JavaWebToken
Ursache:
Wenn man in einer Asp.Net Core 2 MVC Anwendung einen REST Web api Controller einbaut, dann muss man zusätzlich einen JWT Authentity einbauen in der Startup
Ursache:
in der startup.cs wird die Authentifizierung über Java-Tokens eingefügt, damit sich externe Programme ohne User-Login auf die WebApi Daten abrufen können
Lösung:
Die Reihenfolge der Einbindung in der Startup spielt eine Rolle
-1. Erst den JWT Authentifizierung einbauen
-2. Dann die Standard Microsoft Identity Authentifizierung einbauen
//----< 1: JWT-Token >---- //*reference: www.blinkingcaret.com services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "JwtBearer"; options.DefaultChallengeScheme = "JwtBearer"; })
.AddJwtBearer("JwtBearer", jwtBearerOptions => { jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters { .. }; }); //----</ JWT-Token >----
//--< 2: Identity >-- services.AddIdentity<ApplicationUser, IdentityRole>(config => { .. }) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); //--</ Identity >-- |
Login Erkennung
Normalerweise wird beim Aufruf einer Seite der aktuelle User in der Views/Shared/_loginPartial.cshtml abgefragt und erkannt
Hierzu wird der SignInManger und UserManager eingebettet und die Abfrage über UserManager.GetUserID(User) ermittelt.
@inject SignInManager<ApplicationUser> SignInManager @inject UserManager<ApplicationUser> UserManager .. string sIDUserGuid = UserManager.GetUserId(User);
|
_loginPartial.cshtml
@using Microsoft.AspNetCore.Identity @using Freelance.Models @using Freelance.Data
@inject SignInManager<ApplicationUser> SignInManager @inject UserManager<ApplicationUser> UserManager
<div style="margin-right:0px;margin-left:0px"> <a id="btnMenuLogin" href="javascript:void();" onclick="menu_openclose_Login(); "> @{ //--------< Get User-Defined Information >-------- //< get UserGuid > string sIDUserGuid = UserManager.GetUserId(User); //</ get UserGuid >
if (sIDUserGuid == null) { //----< Not logged in >---- <img src="~/_images/ico/User_Login.png" alt="Login Register as User" style="padding:0;height:35px" /> //----</ Not logged in >---- } else |
Defektes Startup:
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //-----------< ConfigureServices() >----------- services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Website_Constants.Connectionstring));
//--< Facebook Api >--
//--< Identity >-- services.AddIdentity<ApplicationUser, IdentityRole>(config => { //< send Register Email > //*prevents registered users from logging in until their email is confirmed. config.SignIn.RequireConfirmedEmail = true; //</ send Register Email > }) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); //--</ Identity >--
//----< JWT-Token >---- //*reference: www.blinkingcaret.com services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "JwtBearer"; options.DefaultChallengeScheme = "JwtBearer"; })
.AddJwtBearer("JwtBearer", jwtBearerOptions => { jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = Website_Constants._secretKey,
ValidateIssuer = true, ValidIssuer = "website_x",
ValidateAudience = true, ValidAudience = "webclients_x",
ValidateLifetime = true, //validate the expiration and not before values in the token
ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date }; }); //----</ JWT-Token >----
services.AddAuthentication().AddFacebook(facebookOptions => { facebookOptions.AppId = Website_Constants.fp_appID; facebookOptions.AppSecret = Website_Constants.fp_secret; }); //--</ Facebook Api >--
// Add application services. services.AddTransient<IEmailSender, EmailSender>();
var optRewrite = new RewriteOptions() .AddRedirectToHttpsPermanent();
services.AddMvc();
//-----------</ ConfigureServices() >----------- } |