读取asp.netcore中的appsettings.json值

问题描述 投票:0回答:1

我正在尝试从appsettings.json文件中读取一些值以进行基本身份验证。在本地代码可以正常工作,但是我对在实时部署应用程序时如何做感到困惑。我的appsettings.json文件看起来像这样

appsettings.json

{
  "BasicAuth": {
    "UserName": "admin",
    "Password": "1234567789"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
}

我用于中间件的代码看起来像这样

startup.cs

public void ConfigureServices(IServiceCollection 
{
            services.AddHttpClient("MyClient", client => {
                client.BaseAddress = new Uri("http://xx.xx.xx.xxx/1/#/nutch/query");
                client.DefaultRequestHeaders.Add("username", "admin");
                client.DefaultRequestHeaders.Add("password", "1234567789");
            });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
         app.UseMiddleware<BasicAuthMiddleware>("http://xx.xx.xx.xxx/abc/#/1/query/");
}

而且我的中间件类看起来像这样

BasicAuthMiddleware.cs如您所见,我必须将整个路径发送到appsettings.json]中的.AddJsonFile文件中

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace searchEngineTesting.Controllers
{
    public class BasicAuthMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly string _realm;

        public BasicAuthMiddleware(RequestDelegate next, string realm)
        {
            _next = next;
            _realm = realm;
        }

        public async Task Invoke(HttpContext context)
        {
            string authHeader = context.Request.Headers["Authorization"];
            if (authHeader != null && authHeader.StartsWith("Basic "))
            {
                // Get the encoded username and password
                var encodedUsernamePassword = authHeader.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries)[1]?.Trim();
                // Decode from Base64 to string
                var decodedUsernamePassword = Encoding.UTF8.GetString(Convert.FromBase64String(encodedUsernamePassword));
                // Split username and password
                var username = decodedUsernamePassword.Split(':', 2)[0];
                var password = decodedUsernamePassword.Split(':', 2)[1];
                // Check if login is correct
                if (IsAuthorized(username, password))
                {
                    await _next.Invoke(context);
                    return;
                }
            }
            // Return authentication type (causes browser to show login dialog)
            context.Response.Headers["WWW-Authenticate"] = "Basic";
            // Add realm if it is not null
            if (!string.IsNullOrWhiteSpace(_realm))
            {
                context.Response.Headers["WWW-Authenticate"] += $" realm=\"{_realm}\"";
            }
            // Return unauthorized
            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        }

        // Make your own implementation of this
        public bool IsAuthorized(string username, string password)
        {
            //IConfiguration config = new ConfigurationBuilder()
            //    .AddJsonFile("appsettings.json", true, true)
            //    .Build();

            IConfiguration config = new ConfigurationBuilder()
                .AddJsonFile("C:/programfiles/path/to/appsettings.json")
                .Build();
            var basicAuthUserName = config["BasicAuth:UserName"];
            var basicAuthPassword = config["BasicAuth:Password"];
            // Check that username and password are correct
            return username.Equals(basicAuthUserName, StringComparison.InvariantCultureIgnoreCase)
                   && password.Equals(basicAuthPassword);
        }
    }
}


我仅通过给出名称appsettings.json而不是给出整个路径来进行尝试,但这不起作用,并且发生了无法找到appsettings.json文件的异常。我如何给它一个概括的路径,这样我就不必一次又一次地更改它,并且我可以读取这些值。

我正在尝试从我的appsettings.json文件中读取一些用于基本身份验证的值。在本地代码可以正常工作,但是我对在实时部署应用程序时如何做感到困惑。我的...

json asp.net-core appsettings
1个回答
0
投票

您可以在中间件构造函数中注入IConfiguration。无需使用配置生成器。

© www.soinside.com 2019 - 2024. All rights reserved.