I am using Asp.net Core 3.1 Web Api For Generate Api And Use Identity Server 4(3.1.2) With asp.net identity core In Same Project(Both In One Project) To Authenticate User. Identity Server 4 Generate Access Token But When Call Api With Postman,EveryTime Return 401. This is my Identity Server 4 Config:
"IdentityServerSetting": {
"IdentityServerAuthority": "https://localhost:5000",
"IdentityResources": [
"openID"
],
"ApiResources": [
{
"Name": "MadPay",
"DisplayName": "MadPay Api",
"UserClaims": [
"name",
"Email"
]
}
],
"Client": [
{
"AccessTokenLifeTime": 3600,
"AllowedGrantTypes": "password",
"ClientId": "angular",
"AlwaysIncludeUserClaimsInIdToken": "true",
"AlwaysSendClientClaims": "true",
"AllowCorsOrigins": [ "https://localhost:5000" ],
"RequireClientSecret": "false",
"AllowedScopes": [ "OpenId", "MadPay" ],
"AllowOfflineAccess": "true"
}
]
}
This Is My ConfigureService
public void ConfigureServices(IServiceCollection services)
{
services.Configure<JwtConfig>(_configuration.GetSection(nameof(JwtConfig)));
services.Configure<IdentityServerSetting>(_configuration.GetSection(nameof(IdentityServerSetting)));
services.AddScoped<IUnitOfWork, UnitOfWork<ApplicationDBContext>>();
services.AddMapperConfigurations();
services.AddServices();
services.AddDbContext<ApplicationDBContext>(opt =>
{
opt.UseSqlServer(_configuration.GetConnectionString("ApplicationConnection"));
});
services.AddMvcCore(opt => opt.EnableEndpointRouting = false)
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.AddAuthorization()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
services.AddResponseCaching();
services.AddIdentityServerConfig(_identityServerSetting);
services.AddApiAuthorization();
services.AddCors();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
}
This Is My Configure
public void Configure(IApplicationBuilder app, IHostEnvironment env)
{
IdentityModelEventSource.ShowPII = true;
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
//app.UseHsts();
app.UseCors(i => i.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.AddExceptionHandling();
app.UseResponseCaching();
app.UseIdentityServer();
app.UseHttpContext();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "api/{controller}/{action}/{id?}");
});
}
AddApiAuthorization Fuction
public static void AddApiAuthorization(this IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(opt =>
{
opt.Authority = "https://localhost:5000";
opt.RequireHttpsMetadata = false;
//opt.Audience = "MadPay";
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
services.AddScoped<IAuthorizationHandler, PermissionAuthorizationHandler>();
services.AddAuthorization(option =>
option.AddPolicy("Permission", builder =>
builder.AddRequirements(new PermissionRequirement()).RequireAuthenticatedUser()
)
);
}
AddIdentityServerConfig Fuction
public static void AddIdentityServerConfig(this IServiceCollection services, IdentityServerSetting config)
{
var finalConfig = MapJsonToConfig(config);
services.AddIdentity<User, Role>(opt =>
{
opt.Password.RequireLowercase = false;
opt.Password.RequireUppercase = false;
opt.Password.RequireNonAlphanumeric = false;
opt.User.RequireUniqueEmail = true;
opt.SignIn.RequireConfirmedAccount = true;
opt.SignIn.RequireConfirmedEmail = true;
})
.AddEntityFrameworkStores<ApplicationDBContext>()
.AddUserManager<AppUserManager>()
//.AddSignInManager<AppSignInManager>()
.AddErrorDescriber<AppErrorDescriberService>()
.AddDefaultTokenProviders();
services.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
})
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(finalConfig.IdentityResources)
.AddInMemoryApiResources(finalConfig.Apis)
.AddInMemoryClients(finalConfig.Clients)
.AddAspNetIdentity<User>()
.AddResourceOwnerValidator<AppIdentityPasswordValidator<User>>();
}
This is My Paload from access token
{
"nbf": 1597823415,
"exp": 1597827015,
"iss": "https://localhost:5000",
"aud": "MadPay",
"client_id": "angular",
"sub": "1",
"auth_time": 1597823413,
"idp": "local",
"name": "osali",
"scope": [
"MadPay",
"offline_access"
],
"amr": [
"pwd"
]
}
And For Call Api Use This url : https://localhost:5000/... And Send Token in Authorization Header : Bearer ....
i think Issued access token is not a problem. I spent a few days And Cant Understand Why is not working and very confused what is wrong!!
Thank You????????