JWT Bearer ASP.Net 核心 3.1 用户在服务器上为空白
JWT Bearer ASP.Net Core 3.1 User is blank on server
今天我一直在尝试使用 Microsoft.AspNetCore.Authentication.JwtBearer 库将 JSON Web 令牌信息绑定到 HttpContext.User。
问题:
每次调用服务器时,我都可以使用 [Authorize] 属性进入函数,但是 User 对象是完全空白的。
很高兴知道每个用户是谁。
我在客户端解码的 JWT:
我的客户端函数调用服务器上的 [Authorize] C# 方法:
testAuth() {
let token = localStorage.getItem("jwt");
console.log(this.jwtHelper.decodeToken(token)); // Where I got the decoded JWT picture
this.http.get(this.baseUrl + "Authentication/Test", {
headers: new HttpHeaders({
"Content-Type": "application/json",
"Authentication": "Bearer " + token
})
}).subscribe(response => {
console.log(response); // never happens
}, err => {
console.log(err); // always happens because User.Identity is null
});
}
服务器方法里User.Identity一直是空白,但是我们通过[授权]属性允许:
[HttpGet]
[Authorize]
public IActionResult Test()
{
// User.Identity is always blank, so a 500 error is thrown because Name == null
return Ok(HttpContext.User.Identity.Name);
}
中间件管道:
Startup.cs:
中的 ConfigureServices()
services.AddControllers();
// Enable CORS (cross origin requests) so other sites can send requests to the auth API
services.AddCors();
// JWT
// Use JSON Web Tokens for auth
services.AddAuthentication(opt => {
opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidateIssuerSigningKey = true,
ValidateLifetime = false,
IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Configuration.GetValue<string>("JwtInfo:SecretKey"))),
ValidIssuer = Configuration.GetValue<string>("JwtInfo:ServerAddress", "http://localhost:44351/"), // Address that this project is running on
ValidAudience = Configuration.GetValue<string>("JwtInfo:ValidRecipients", "http://localhost:44364/") // Addresses of projects that are allowed to access this API
};
});
在Startup.cs中配置():
app.UseHttpsRedirection();
app.UseRouting();
// Allow CORS (cross origin requests)
// This must come before routing, authentication, and endpoints
app.UseCors(option => option
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
// Use JWT authentication
app.UseAuthentication();
app.UseAuthorization();
如何正确地将 JWT 声明绑定到用户的声明?
如果用户为空,我如何通过[授权]?
感谢您的帮助!
您需要使用 IHttpContextAccessor 并在配置服务方法中注册依赖项。
第 1 步 - 注册依赖项
services.AddHttpContextAccessor();
第 2 步 - 在控制器的构造函数中或任何需要的地方注入依赖项
私有只读 IHttpContextAccessor _httpContextAccessor;
public MyController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
第 3 步 - 使用以下代码获取用户信息
var 用户 = _httpContextAccessor.HttpContext.User.Identity;
来自 ms 文档:
对于需要访问 HttpContext 的其他框架和自定义组件,推荐的方法是使用内置依赖注入容器注册依赖。依赖项注入容器将 IHttpContextAccessor 提供给任何在其构造函数中声明为依赖项的 类:
这里是微软官方文档,请仔细阅读以获取更多详细信息:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context
包含令牌的 header 设置不正确。
应该是:
"Authorization": "Bearer " + token
而不是 "Authentication":"Bearer " + 令牌
我在使用 Asp.net Core 和 angular 开发的应用程序中遇到了这个问题。对我有用的解决方案是在客户端设置 (angular) allowedDomains: ["ServerAdress:port"], in app.module
今天我一直在尝试使用 Microsoft.AspNetCore.Authentication.JwtBearer 库将 JSON Web 令牌信息绑定到 HttpContext.User。
问题: 每次调用服务器时,我都可以使用 [Authorize] 属性进入函数,但是 User 对象是完全空白的。 很高兴知道每个用户是谁。
我在客户端解码的 JWT:
我的客户端函数调用服务器上的 [Authorize] C# 方法:
testAuth() {
let token = localStorage.getItem("jwt");
console.log(this.jwtHelper.decodeToken(token)); // Where I got the decoded JWT picture
this.http.get(this.baseUrl + "Authentication/Test", {
headers: new HttpHeaders({
"Content-Type": "application/json",
"Authentication": "Bearer " + token
})
}).subscribe(response => {
console.log(response); // never happens
}, err => {
console.log(err); // always happens because User.Identity is null
});
}
服务器方法里User.Identity一直是空白,但是我们通过[授权]属性允许:
[HttpGet]
[Authorize]
public IActionResult Test()
{
// User.Identity is always blank, so a 500 error is thrown because Name == null
return Ok(HttpContext.User.Identity.Name);
}
中间件管道: Startup.cs:
中的 ConfigureServices()services.AddControllers();
// Enable CORS (cross origin requests) so other sites can send requests to the auth API
services.AddCors();
// JWT
// Use JSON Web Tokens for auth
services.AddAuthentication(opt => {
opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidateIssuerSigningKey = true,
ValidateLifetime = false,
IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Configuration.GetValue<string>("JwtInfo:SecretKey"))),
ValidIssuer = Configuration.GetValue<string>("JwtInfo:ServerAddress", "http://localhost:44351/"), // Address that this project is running on
ValidAudience = Configuration.GetValue<string>("JwtInfo:ValidRecipients", "http://localhost:44364/") // Addresses of projects that are allowed to access this API
};
});
在Startup.cs中配置():
app.UseHttpsRedirection();
app.UseRouting();
// Allow CORS (cross origin requests)
// This must come before routing, authentication, and endpoints
app.UseCors(option => option
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
// Use JWT authentication
app.UseAuthentication();
app.UseAuthorization();
如何正确地将 JWT 声明绑定到用户的声明?
如果用户为空,我如何通过[授权]?
感谢您的帮助!
您需要使用 IHttpContextAccessor 并在配置服务方法中注册依赖项。
第 1 步 - 注册依赖项
services.AddHttpContextAccessor();
第 2 步 - 在控制器的构造函数中或任何需要的地方注入依赖项
私有只读 IHttpContextAccessor _httpContextAccessor;
public MyController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
第 3 步 - 使用以下代码获取用户信息 var 用户 = _httpContextAccessor.HttpContext.User.Identity;
来自 ms 文档:
对于需要访问 HttpContext 的其他框架和自定义组件,推荐的方法是使用内置依赖注入容器注册依赖。依赖项注入容器将 IHttpContextAccessor 提供给任何在其构造函数中声明为依赖项的 类:
这里是微软官方文档,请仔细阅读以获取更多详细信息:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context
包含令牌的 header 设置不正确。 应该是:
"Authorization": "Bearer " + token
而不是 "Authentication":"Bearer " + 令牌
我在使用 Asp.net Core 和 angular 开发的应用程序中遇到了这个问题。对我有用的解决方案是在客户端设置 (angular) allowedDomains: ["ServerAdress:port"], in app.module