- 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/
我有 2 个 .cs 文件,每个文件中都有一个类。如何在 Form2.cs 中的另一个类中调用 Form1.cs 中的一个类中的方法? 看起来像这样...... Form1.cs public par
我正在尝试了解指针的移动方式。以下是程序,我知道如果 int cs={1,2,3}; 然后cs指向cs[0]我不清楚的是 *cs 指向什么。 #include int main() {
我是 ASP.NET Core 新手。我正在使用 ASP.NET Core 7。我读到在 ASP.NET Core 7 中他们删除了 Startup.cs。有人可以告诉我如何在此示例中将 Startu
所以我知道一般来说,这是不可能的,因为Jon Skeet said so . 但是我的 .cs 文件是简单的类,在顶部有一个或两个 usings。我需要一个包含所有类的文件,这样我就可以将它作为单个文
到目前为止,基本上我的脚本将值发送到网关,然后被重定向到 CS 购物车。在该页面中,我获取返回的值并对其进行操作。 我使用 fn finish 和 fn 更改订单状态来完成订单,但无论我做什么,我都会
我需要一个匹配所有以 .cs 结尾的字符串的正则表达式,但如果它们以 .g.cs 结尾,则它们不应该匹配。我正在使用 .NET 正则表达式。 最佳答案 如果是 .cs 而不是 .g.cs,这将匹配结尾
到目前为止,基本上我的脚本将值发送到网关,然后被重定向到 CS 购物车。在该页面中,我获取返回的值并对其进行操作。 我使用 fn finish 和 fn 更改订单状态来完成订单,但无论我做什么,我都会
我的 Form.cs 中有一个函数,我想在我的 program.cs 中调用它 但是如果函数不是静态的,program.cs就不能用了。如果它是静态的,则 Form.cs 无法使用它,因为它涉及非静态
因此,当我抓取不同解决方案的一些文件并将它们粘贴到不同的解决方案中时,我的 Mainform 和设计师分离了。如果我运行我的程序,表格会正确显示,但是当我在设计模式下查看我的表格时,它是一个空白表格。
我有一个用户控件 (UserControl1.ascx),我对其 cs 文件进行了更改。UserControl1.ascx 正被两个或多个使用 LoadControl 的 aspx 文件使用.我不想部
我正在学习一些 Xamarin 开发。当我研究 Xamarin 项目的例子时,like this one ,我有时会看到一个页面有一个与 xaml 文件及其代码隐藏文件同名的神秘文件,但以 *CS.c
是的,这有点毫无意义,但我想知道......我的 MVC 应用程序中所有这些代码隐藏文件都困惑了。据我所知,我需要这些文件的唯一原因是告诉 ASP.NET 我的页面是从 ViewPage 而不是 Pa
我已经从一个不再可用的人那里继承了一个网站。在已部署的文件夹中,我有 Config.aspx(请参阅代码)。但是我找不到代码隐藏文件。配置页面有效。我在哪里可以找到 .cs 文件? 谢谢
在为 Outlook(或其他潜在的 Office 程序)开发插件时,在主类上调用方法可能很有用,但是如何从事件处理程序(例如功能区中的 button_click 事件)中执行此操作。 最佳答案 使用:
我已经创建了 PlayPage.xaml、PlayPage.xaml.cs 和 Game.cs 文件。PlayPage.xaml.cs 有两个变量,windowWidth 和 windowHeight
我一直在关注使用 Caliburn Micro 的 MVVM 模式教程 https://www.youtube.com/watch?v=laPFq3Fhs8k .xaml.cs 和 ViewModel
我试图将一个值(来自一个对象)放在一个变量中,并将它放在一个表单的文本框中。 表单代码如下: public Form1(Deck mainDeck) { InitializeC
我知道这很基础,但我找不到任何关于如何在 MSDN、Google 搜索和 stackoverflow 之间执行此操作的指南/教程。 我创建了一个新的 Windows 窗体应用程序,这里我有 Progr
VS2017 15.4.1 ASP.NET MVC 5.2.3 T4MVC 4.0.0 AutoT4MVC 1.5.3 再加工者 我在这个项目中已经使用 T4MVC] 好几个月了,没有任何问题。然而,
我正在尝试配置 kestrel,以便当它处于原始模式时在特定端口上运行。但是这样做似乎 launchsettings.json 需要传递命令行参数才能这样做,因为没有直接选项并且它总是在端口 5000
我是一名优秀的程序员,十分优秀!