如何在 saturn 应用程序中访问和使用用户机密
How to access and use user secrets in a saturn application
编辑:这里是对 Koenig Lear 的回答的一些改编,以防其他人偶然发现这个问题:
将用户机密添加到我使用此代码的应用程序,其中 config.AddUserSecrets
使用的 ID 是使用 dotnet user-secrets init
添加到 Server.fsproj 的机密 ID。
app
.ConfigureAppConfiguration(
System.Action<Microsoft.Extensions.Hosting.HostBuilderContext,IConfigurationBuilder> ( fun ctx config ->
config.AddUserSecrets("6de80bdf-2a05-4cf7-a1a8-d08581dfa887") |> ignore
)
)
|> run
然后可以通过以下方式在路由器中使用秘密:
forward "/api" (fun next ctx ->
let settings = ctx.GetService<IConfiguration>()
let cString = settings.["Some:ConnectionString"]
webApp cString next ctx
)
原题:
我正在思考如何访问用户机密,但我不能完全翻译 example provided by microsoft。
假设我在安全堆栈环境中有 Saturn 运行(在这种情况下很可能无关紧要)。我有一个 webApp,它接受一个连接字符串,然后使用提供的连接字符串处理请求以进行数据库访问:
let router connectionString = forward "/api" (webApp connectionString)
和一个包含我使用 dotnet user-secrets set
启动的连接字符串的用户机密:
{
"Some:ConnectionString": "Data Source=..."
}
和一个使用路由器的application
:
let app = application {
url ("https://0.0.0.0:" + port.ToString() + "/")
use_router (router )
}
我想做的是以某种方式提取用户密码并将其传递给路由器。我似乎不明白的是在哪里以及如何执行 ASP.NetCore 通常执行的依赖注入(请参阅 MS Docs 示例中通过 Configuration API
配置用户密码的位置。)。
与我想要做的非常接近的是 this section from the example :
public class Startup
{
private string _connection = null;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var builder = new SqlConnectionStringBuilder(
Configuration.GetConnectionString("Movies"));
builder.Password = Configuration["DbPassword"];
_connection = builder.ConnectionString;
}
public void Configure(IApplicationBuilder app)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync($"DB Connection: {_connection}");
});
}
}
第一个问题是我找不到如何获取包含 GetConnectionString
方法的 Configuration
对象。但即使我能做到这一点,我也会通过 application
monad 中的 service_config
操作来配置这一部分,对吧?但是后来我无法将获取的连接字符串用于路由器,因为use_router
操作与它分离。
我在 netcoreapp/asp.netcore 3.1 上使用 Saturn 0.14.1。
如有任何帮助,我们将不胜感激!
您应该可以使用 ConfigureAppConfiguration 方法:
open Microsoft.Extensions.Configuration
open Microsoft.Extensions.Configuration.UserSecrets
let configureAppConfiguration (context: WebHostBuilderContext) (config:IConfigurationBuilder) =
config
.AddUserSecrets()
app
.ConfigureAppConfiguration(configureAppConfiguration)
.run
在您的路由器中,您可以像这样使用它:
let webApp = router {
get "/" (fun next ctx ->
task {
let settings = ctx.GetService<IConfiguration>()
let s = settings.["Some:ConnectionString"]
...
})
}
编辑:这里是对 Koenig Lear 的回答的一些改编,以防其他人偶然发现这个问题:
将用户机密添加到我使用此代码的应用程序,其中 config.AddUserSecrets
使用的 ID 是使用 dotnet user-secrets init
添加到 Server.fsproj 的机密 ID。
app
.ConfigureAppConfiguration(
System.Action<Microsoft.Extensions.Hosting.HostBuilderContext,IConfigurationBuilder> ( fun ctx config ->
config.AddUserSecrets("6de80bdf-2a05-4cf7-a1a8-d08581dfa887") |> ignore
)
)
|> run
然后可以通过以下方式在路由器中使用秘密:
forward "/api" (fun next ctx ->
let settings = ctx.GetService<IConfiguration>()
let cString = settings.["Some:ConnectionString"]
webApp cString next ctx
)
原题:
我正在思考如何访问用户机密,但我不能完全翻译 example provided by microsoft。
假设我在安全堆栈环境中有 Saturn 运行(在这种情况下很可能无关紧要)。我有一个 webApp,它接受一个连接字符串,然后使用提供的连接字符串处理请求以进行数据库访问:
let router connectionString = forward "/api" (webApp connectionString)
和一个包含我使用 dotnet user-secrets set
启动的连接字符串的用户机密:
{
"Some:ConnectionString": "Data Source=..."
}
和一个使用路由器的application
:
let app = application {
url ("https://0.0.0.0:" + port.ToString() + "/")
use_router (router )
}
我想做的是以某种方式提取用户密码并将其传递给路由器。我似乎不明白的是在哪里以及如何执行 ASP.NetCore 通常执行的依赖注入(请参阅 MS Docs 示例中通过 Configuration API
配置用户密码的位置。)。
与我想要做的非常接近的是 this section from the example :
public class Startup
{
private string _connection = null;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var builder = new SqlConnectionStringBuilder(
Configuration.GetConnectionString("Movies"));
builder.Password = Configuration["DbPassword"];
_connection = builder.ConnectionString;
}
public void Configure(IApplicationBuilder app)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync($"DB Connection: {_connection}");
});
}
}
第一个问题是我找不到如何获取包含 GetConnectionString
方法的 Configuration
对象。但即使我能做到这一点,我也会通过 application
monad 中的 service_config
操作来配置这一部分,对吧?但是后来我无法将获取的连接字符串用于路由器,因为use_router
操作与它分离。
我在 netcoreapp/asp.netcore 3.1 上使用 Saturn 0.14.1。
如有任何帮助,我们将不胜感激!
您应该可以使用 ConfigureAppConfiguration 方法:
open Microsoft.Extensions.Configuration
open Microsoft.Extensions.Configuration.UserSecrets
let configureAppConfiguration (context: WebHostBuilderContext) (config:IConfigurationBuilder) =
config
.AddUserSecrets()
app
.ConfigureAppConfiguration(configureAppConfiguration)
.run
在您的路由器中,您可以像这样使用它:
let webApp = router {
get "/" (fun next ctx ->
task {
let settings = ctx.GetService<IConfiguration>()
let s = settings.["Some:ConnectionString"]
...
})
}