我一直在关注一些关于.net等编程的教程,它有点过时了,还有一部分关于JWT,我被卡住了,因为教程展示了我在.net 2.0等之前相信的完成方式.(在 Configure 方法中,而不是在带有 app.UseJwtBearerAuthentication 的 ConfigureServices 中)。
在 startup.cs 文件中,我应该从 jsonsettings 文件中获取 Issuer、Key 和 Expiry Minutes,但无论我尝试做什么,GetService 或 Configutration.GetSection 每次都返回 null。而 ofc 这意味着 ValidIssuer 和 IssuerSigningKey 也是空的,这给了我错误“System.ArgumentNullException:字符串引用未设置为字符串的实例。” . 我会很感激一些建议:)
应用设置.json
{
"Logging": {
"Console":{
"LogLevel": {
"Default": "Warning"
},
"IncludeScopes": false
},
"general": {
"name": "Passenger"
},
"Jwt": {
"Key": "key",
"Issuer": "http://localhost:5000",
"expiryMinutes": 5
}
}}
启动.cs
...
public class Startup
{
public IContainer ApplicationContainer {get; private set;}
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddOptions();
//services.AddRazorPages();
//var config = Configuration;
//var settings = Configuration.GetSection("JwtSettings").Get<JwtSettings>();
var sp = services.BuildServiceProvider();
var jwtSettings = sp.GetService<JwtSettings>();
// var appSettingsSection = Configuration.GetSection("JwtSettings");
// services.Configure<JwtSettings>(appSettingsSection); //get key from appSettings
// var appSettings = appSettingsSection.Get<JwtSettings>();
// var key = Encoding.UTF8.GetBytes(appSettings.Key);
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
}
);
services.AddAuthentication(option =>
{
option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateLifetime = false,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings.Issuer,
ValidateAudience = false,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Key))
};
});
var builder = new ContainerBuilder();
builder.Populate(services);
builder.RegisterModule(new ContainerModule(Configuration));
builder.RegisterModule(new SettingsModule(Configuration));
ApplicationContainer = builder.Build();
return new AutofacServiceProvider(ApplicationContainer);
}
...
JwtSettings.cs
public class JwtSettings
{
public string Key {get; set;}
public string Issuer {get; set;}
public int ExpiryMinutes {get; set;}
}
实际上,我都归结为 appsettings.json 文件的错误格式。我错过了一个“}”,它无法正确读取。我也用过
var signingKey = Configuration.GetSection("JwtSettings:Key").Value;
和
var issuer = Configuration.GetSection("JwtSettings:Issuer").Value;
为了获得所需的值并且有效,我不再得到 ERROR 500,而是 ERROR 401,这是预期的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句