- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我一直在尝试以 JWT 分发的形式设置一个带有 token 身份验证的小型测试 api, token 分发部分按预期工作。
然而,由于我想让我的 JWT 服务的方法更通用,以允许对 token 进行不同类型的签名(因为我更喜欢私钥/公钥对),所以我尝试在 appsettings 文件中设置更多选项这将决定 token 的生成方式,我开始使用依赖注入(inject)加载这些设置,直到现在我几乎没有接触过。
所以当我想将我设置为单例的那些配置类(到目前为止我已经通读过的大多数指南都这样做了,所以我认为它有点正确)并在ConfigureServices 他们添加的方法,这样我就可以使用我认为应该设置的参数,因为我通过获取 appsettings 文件的一部分在上面配置了几行。
但是,一旦我尝试访问它们,我就什么也得不到了,而是留下了空值。
启动.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//the token config takes values from the appsettings.json file
var tokenConf = Configuration.GetSection("TokenConfiguration");
services.Configure<TokenConfiguration>(tokenConf);
//the signing credentials are assigned in the JwtTokenService constructor
var signingConf = new SigningConfiguration();
services.AddSingleton<SigningConfiguration>(signingConf);
//my token service
services.AddSingleton<IJwtTokenService, JwtTokenService>();
//i try to get hold of the actual values to use later on
var provider = services.BuildServiceProvider();
TokenConfiguration tc = provider.GetService<TokenConfiguration>();
SigningConfiguration sc = provider.GetService<SigningConfiguration>();
//i wanna use the values in here when i set the parameters for my authentication
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
x.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
return Task.CompletedTask;
}
};
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
//values used here since i specify issuer, audience and what kind of key to use in the settings
//the key & credentials differ based on a bool in the settings file and will either be a symmetric or asymmetric key
ValidIssuer = tc.Issuer,
ValidAudience = tc.Audience,
IssuerSigningKey = sc.Key
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc();
}
}
JwtTokenService.cs(IJwtTokenService只有CreateToken方法在这里实现)
public class JwtTokenService : IJwtTokenService
{
private TokenConfiguration tokenConf;
public SigningConfiguration signingConf;
public JwtTokenService(IOptions<TokenConfiguration> tc) {
tokenConf = tc.Value;
signingConf = new SigningConfiguration();
//if the asymmetric bool is set to true, assign a new rsa keypair to the signing configuration
//otherwise, use a symmetric key with a hmac hash
if (tc.Value.AsymmetricKey)
{
using (var provider = new RSACryptoServiceProvider(2048))
{
signingConf.Key = new RsaSecurityKey(provider.ExportParameters(true));
}
signingConf.SigningCredentials =
new SigningCredentials(
signingConf.Key,
SecurityAlgorithms.RsaSha256);
}
else {
signingConf.Key =
new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(tc.Value.HmacSecret));
signingConf.SigningCredentials =
new SigningCredentials(
signingConf.Key,
SecurityAlgorithms.HmacSha512);
}
}
/// <summary>
/// Creates a token based on the running configuration
/// </summary>
public string CreateToken(List<Claim> claims)
{
var token = new JwtSecurityToken(
issuer: tokenConf.Issuer,
audience: tokenConf.Audience,
claims: claims,
expires: DateTime.UtcNow.AddMinutes(tokenConf.Minutes),
signingCredentials: signingConf.SigningCredentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
token 配置.cs
public class TokenConfiguration
{
public string Audience { get; set; }
public string Issuer { get; set; }
public int Minutes { get; set; }
public bool AsymmetricKey { get; set; }
public string HmacSecret { get; set; }
}
SigningConfiguration.cs
public class SigningConfiguration
{
public SecurityKey Key { get; set; }
public SigningCredentials SigningCredentials { get; set; }
}
应用设置.json
"TokenConfiguration": {
"Audience": "ExampleAudience",
"Issuer": "ExampleIssuer",
"Minutes": 30,
"AsymmetricKey": true,
"HmacSecret": "example-secret-top-secret-secret-is_secret"
(该项目在 asp.net core 2.1 中运行以防万一)
我是 DI 的新手,找不到很多用例与我相同的示例,而且大多数此类案例涉及实际服务,而不是通过 DI 添加“配置”类。
可能有更好的方法来做到这一点,我可能只是愚蠢,因为没有注意到或不知道要谷歌搜索什么才能得到正确的答案,很可能会观看/阅读一些关于 DI 的内容在此之后不管。
任何意见或想法都将不胜感激,因为我对 asp.net core 和整个流程还是陌生的。
作为关于私钥生成的一个小问题,在我的例子中,最好将生成的 key 对存储在 keystore 中,或者将其存储在内存中,或者通过 openSSL 之类的东西生成它们并从中读取在启动时是最佳选择吗?
最佳答案
您正在请求 TokenConfiguration
而不是 IOptions<TokenConfiguration>
来自服务提供商。更改此行
TokenConfiguration tc = provider.GetService<TokenConfiguration>();
SigningConfiguration sc = provider.GetService<SigningConfiguration>();
与
IOptions<TokenConfiguration> tc = provider.GetService<IOptions<TokenConfiguration>>();
IOptions<SigningConfiguration> sc = provider.GetService<IOptions<SigningConfiguration>>();
然后使用 tc.Value
访问选项.
建筑 ServiceProvider
在ConfigureServices
这不是一个好主意,我会通过 Configuration["TokenConfiguration:Audience"]
直接从配置中获取我需要的任何地方 ConfigureServices
.
关于c# - 以相同的 ConfigureServices 方法访问在 asp.net core 的 startup.cs 文件中的 ConfigureServices 中创建的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53707133/
我试图在 GCE 上启动时让以下脚本在 CentOS 实例上运行。 我在实例名称上设置了自定义元数据“启动脚本”,并将以下脚本作为值。 该脚本不会在启动、重启或运行/usr/share/google/
我在我的一个类中添加了一个 startUp-Method,它立即退出了我的图像。有没有办法阻止 Photo 执行该方法以便我可以修复它? 最佳答案 不,这是一个持续讨论的问题。见 this post在
我在启动类中收到“'Startup.Configuration' 和'Startup.Configuration' 之间的歧义”错误。我不知道我做了什么导致这个问题。我所做的只是创建了一个 DBCon
asp.net 5 中的 Startup 类让我觉得很奇怪。它不是类 Startup : ISomething 或 Startup : BaseSomething ,其中接口(interface)或基
我有这个代码: https://github.com/nbarbettini/SimpleTokenProvider/tree/master/test/SimpleTokenProvider.Test
这个问题在这里已经有了答案: What does the servlet value signify (11 个答案) 关闭 7 年前。 考虑到同样的问题,我是 J2EE 的新手,请回答。当我们使
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 8年前关闭。 Improve this
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
如何以编程方式查找在设备启动时启动的应用程序列表。有什么方法可以以编程方式禁用您不需要的自动启动应用程序。 谢谢 最佳答案 除了删除有问题的应用程序之外,别无他法。 API 表示系统必须接受对 BOO
我知道它们用于调用 main(),但如果那是唯一目的,那么拥有不同的 crt 文件有什么意义。为什么不使用默认的而不是创建自己的? 最佳答案 CRT 文件是 C 运行时文件。您最有可能遇到的是 crt
我正在运行一个带有在重启时调用的启动脚本的 EC2 实例。此启动脚本在启动容器之前检查 docker 守护进程是否正在运行,但失败并显示错误:Post http:///var/run/docker.s
我有一个项目,其中包含许多具有自己的日志记录的“工具”类。这些日志文件是在应用程序启动时创建的,但在使用之前一直为空。 是否可以告诉logback在启动时不应该创建空文件?但是仅在使用它们时? 不知何
我正在尝试创建自己的自定义钻取功能,其中 URL dynamics://0?myfunction_123456 将启动我自己的代码。 在 C\SysStartupCmd\construct 中,这个基
我有一个 RFID 模块连接到我的 beaglebone 并使用 python 代码读取 ID 标签。现在,我希望我的 python 代码在没有任何命令的情况下登录我的 beaglebone 时直接在
我试图探索一些 ASP.NET-5 应用程序,我在其中找到了 startup.cs 文件。我们在这里设置路由和所有(当然不仅仅针对路由)。我还看到一些演示,其中显示了依赖注入(inject)的使用 h
我遇到以下问题。我有一个带有 UI、nib 等的 Cocoa 应用程序。我需要能够在后台或前台启动该应用程序。换句话说,我需要前者中的 NSApplicationActivationPolicyPro
我在 Windows 上,根据 this startup.el 用于emacs 的启动。但是当我在这个文件中设置代码时(C:\Users\frountch\Progs\emacs24\share\em
asp.net mvc 6 beta5 我尝试使用 config.json 来激活\禁用日志记录 public IConfiguration Configuration { get; set; } p
我一直在查看 ASP.NET Web API 默认项目,它带有 ASP.NET Identity 身份验证,它使用 Owin。我在谷歌上搜索了一下,发现 Owin 旨在将应用程序与服务器分离,并且它的
我是一名优秀的程序员,十分优秀!