【问题标题】:How to access and use user secrets in a saturn application如何在 saturn 应用程序中访问和使用用户机密
【发布时间】:2020-07-01 13:39:48
【问题描述】:

编辑:以下是对 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 在 SAFE 堆栈环境中运行(在这种情况下很可能无关紧要)。我有一个 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。

任何形式的帮助都将不胜感激!

【问题讨论】:

    标签: asp.net-core f# saturn-framework safe-stack


    【解决方案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"]
                ...
            })
    }
    

    【讨论】:

    • 这是我最初尝试的方法之一,但ConfigureAppConfiguration 不将函数作为输入,而是 System.Action:此表达式的类型应为 'System.Action' 但这里有类型 ''a -> 'b -> IConfigurationBuilder'。除此之外,这是添加秘密的方法吗?我将如何从您的示例中访问它们?
    • @Mutagene Action 只是一个函数类型 :) C# 中的函数不是一流的,因此它们需要创建一个委托类型:System.Action 但在 f# 中这只是 Action = 'a->'b->单位
    • 我不得不稍微调整一下你的代码,但多亏了你,我才让它工作。非常感谢你!生病添加我对原始问题的改编,以防其他人偶然发现这一点。
    猜你喜欢
    • 2021-04-18
    • 2018-05-31
    • 2023-01-12
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多