Я пытаюсь использовать JWT в основном приложении webapi.Вот мой Startup.ConfigureServices()
:
services.AddDbContextPool("Bla Bla");
services.AddIdentity<IdentityUser, IdentityRole>("Bla Bla");
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(o => {
o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(c => {
c.RequireHttpsMetadata = false;
c.SaveToken = true;
c.TokenValidationParameters =
new TokenValidationParameters {
ValidIssuer = Configuration["JwtIssuer"],
ValidAudience = Configuration["JwtIssuer"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration["JwtKey"])),
ClockSkew = TimeSpan.Zero
};
});
services.AddRouting("Bla Bla");
services.AddMvcCore("Bla Bla").AddControllersAsServices();
И это Startup.Configure()
метод:
app.UseAuthentication();
app.UseMvc(rb =>
{ rb.MapRoute("api_default", "{controller}/{action}/{id?}"); });
В любом случае, я создал защитное действие для проверки (которое я ожидаювернуть HTTP 401 Unauthorized
ошибку):
public class AccountController : ControllerBase {
[HttpGet]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public async Task<object> Info() {
return "Authorized!";
}
}
Но он получает авторизацию и отвечает "Авторизован!"все время.Кажется, атрибут Authorize
вообще не влияет.Я что-то упустил?
PS Я попробовал оба атрибута [Authorize]
и [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
.
PS2 Я попытался расширить контроллер с ControllerBase
и Controller
.
PS3 Я пытался без очистки утверждений по умолчанию (убрал эту строку JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
).
Ни одно из них не сработало.
Инфраструктура и пакеты:
- Целевая структура:
netcoreapp2.1
Microsoft.AspNetCore
Версия = 2.1.6
Microsoft.AspNetCore.Authentication.JwtBearer
Версия = 2.1.2
Microsoft.AspNetCore.Identity.EntityFrameworkCore
Версия = 2.1.6
Microsoft.AspNetCore.Mvc.Core
Версия = 2.1.3
ОБНОВЛЕНИЕ:
Согласно @ sellotape'sкомментарий , я вернул объект User
из действия:
[HttpGet]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public async Task<object> Info() {
return User;
}
А вот вывод JSON:
{
"identities": [
{
"isAuthenticated": false,
"claims": [],
"roleClaimType": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
"nameClaimType": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
}
],
"identity": {
"isAuthenticated": false,
"claims": [],
"roleClaimType": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
"nameClaimType": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
},
"claims": []
}