小编sil*_*ent的帖子

ASP.NET core - 简单的API密钥身份验证

我正在尝试为控制器中的某些 API 构建一个超级简单的 API 密钥身份验证。为此,我有这个ConfigureServices()

services.AddAuthorization(options =>
{
  options.AddPolicy(
    Auth.Constants.WebmasterPolicyName,
    policy =>
      policy.RequireAssertion(context =>
      {
        if (context.Resource is HttpContext httpContext)
        {
          if (httpContext.Request.Headers.TryGetValue("X-API-KEY", out var header))
          {
            var val = header.FirstOrDefault()?.ToLower();
            if (val == "my-super-secret-key")
            {
              return Task.FromResult(true);
            }
          }
        }
        return Task.FromResult(false);
      })
  );
});
Run Code Online (Sandbox Code Playgroud)

我用这个装饰了一个 API:

[HttpDelete("{itemId:guid}")]
[Authorize(Policy = Auth.Constants.WebmasterPolicyName)]
public async Task<ActionResult> DeleteCatalogItemAsync(Guid itemId)
Run Code Online (Sandbox Code Playgroud)

当我在请求中设置正确的 API 密钥时,效果非常好。

问题是负面情况:当密钥丢失或错误时,我会收到 500 错误:

System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core .net-6.0

16
推荐指数
2
解决办法
4万
查看次数

ASP.NETCORE 在ConfigureServices 中使用功能标志

我正在使用此处描述的功能标志。它工作正常,我只是想知道如果我想在内部不同的服务实现之间切换,以下是否真的是使用它们的最佳方法ConfigureServices()

到目前为止我有以下内容:

using Microsoft.FeatureManagement;

public void ConfigureServices(IServiceCollection services)
{
    services.AddFeatureManagement();

    var sp = services.BuildServiceProvider();
    var featureManager = sp.GetService<IFeatureManager>();

    if (featureManager.IsEnabledAsync("UseServiceB").Result)
    {
        services.AddHostedService<MyServiceB>();
    }
    else
    {
        services.AddHostedService<MyServiceA>();
    }
}
Run Code Online (Sandbox Code Playgroud)

特别是因为IFeatureManager只提供了一个异步方法来检查功能,这感觉不太对劲?!

c# .net-core asp.net-core .net-5

12
推荐指数
1
解决办法
2039
查看次数

.NET Core Workerservice - 如何在没有 HTTP 的情况下提供运行状况检查端点?

我构建了一个在 kubernetes 上运行的 ASP.NET Core Worker Service(它处理队列中的消息)。由于它是后台服务,因此目前没有任何 HTTP 端点。现在我想向其中添加 k8s 的运行状况/活跃性端点 - 最好利用.NET Core 标准运行状况检查

所以我的问题是:有没有一种方法可以公开这些运行状况检查,而无需以 k8s 可以使用它们的方式(TCP 或通用命令)增加 HTTP 端点的开销?任何指向示例的指针都会很棒!谢谢!

c# kubernetes asp.net-core

11
推荐指数
1
解决办法
5978
查看次数

反序列化XmlDocument的最短方法

我正在寻找一种简洁的方法来反序列化XmlDocument对象.我发现最接近的是这个,但我真的很想知道是否有更好的方法(在.NET 4.5甚至4.6),因为我已经有了XmlDocument.

所以目前看起来如下:

// aciResponse.Data is a XmlDocument
MyClass response;
using (XmlReader reader = XmlReader.Create((new StringReader(aciResponse.Data.InnerXml))))
{
    var serializer = new XmlSerializer(typeof(MyClass));
    response =  (MyClass)serializer.Deserialize(reader);
}
Run Code Online (Sandbox Code Playgroud)

谢谢你有更好的主意!

c# xml .net-4.5 .net-4.6

10
推荐指数
3
解决办法
2万
查看次数

Azure Cosmos DB - 检查项目是否不存在,而不向 Application Insights 抛出错误

我在 ASP.NET Core 3.1 中构建了一个简单的玩家跟踪 API 应用程序,该应用程序使用 Azure Cosmos DB 作为后端。

创建新玩家条目的 API 首先使用以下命令检查 Cosmos DB 中是否已存在给定分区键下具有相同 ID 的条目:

try
{
    ItemResponse<Player> response = await this._playerContainer.ReadItemAsync<Player>(playerid, new PartitionKey(partitionkey));
    return Conflict();
}
catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
    // There is some more logic happening here so I cannot directly just call CreateItemAsync()... and return the Conflict response that this might return.
    ItemResponse<GameResult> response = await this._gameResultContainer.CreateItemAsync<GameResult>(gameresult, new PartitionKey(gameresult.PlayerId));
    // ...        
    return Accepted();
}
Run Code Online (Sandbox Code Playgroud)

仅当此操作不返回任何内容时,我才会继续将创建请求放入后端工作队列中。否则,我将向 API 调用者返回 409-冲突。

实际插入发生在异步后端工作程序中。但我想直接返回 …

c# azure azure-application-insights asp.net-core azure-cosmosdb

10
推荐指数
1
解决办法
1万
查看次数

检测是否在 Azure DevOps 管道中运行?

*.exe是否有任何广泛接受的方法来检测它是否作为 ADO 管道的一部分运行?该脚本将作为管道的一部分和在工作站上运行,并且应该能够非常有信心地确定它在哪里运行(如果可能)。

例如。任何为此目的的预定义变量(无法找到)或其他可以检查的预定义值?

azure-devops

9
推荐指数
1
解决办法
4090
查看次数

Powershell - 禁用彩色命令输出

我正在 Powershell(或 Powershell Core,两者都是此处的选项)中运行命令 ( New-AzResourceGroupDeployment -WhatIf),它会产生一些非常丰富多彩的输出,如下所示:

在此输入图像描述

问题是,当我在 Azure DevOps 管道中运行它时,那里的日志记录会被颜色混淆并产生大量乱码: 在此输入图像描述

所以我的问题是:由于这个命令本身没有这样的选项,PowerShell(核心)中是否有通用方法来禁用命令产生彩色输出?

powershell azure-devops

8
推荐指数
1
解决办法
4198
查看次数

Azure Cosmos DB - 为查询提供分区键的方式有何不同?

我正在从 .NET Core 应用程序查询 Cosmos DB 集合。现在我想知道,在如何向查询提供分区键方面是否有任何区别(即:以一种方式与另一种方式相比更好)?

下面region是我的分区键。

A)

var queryString = $"SELECT TOP 100 * FROM c WHERE c.region ='{region}'";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString));
Run Code Online (Sandbox Code Playgroud)

b)

var queryString = "SELECT TOP 100 * FROM c";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(region) });
Run Code Online (Sandbox Code Playgroud)

至少 RU(请求单位)看起来是相同的,所以 Cosmos DB 可能会在内部优化查询并将 a) 重写为 b),反之亦然?!

c# azure azure-cosmosdb

7
推荐指数
1
解决办法
2941
查看次数

将文件保存到 Azure Functions 中的临时位置

我有一个 Azure 函数,我正在尝试将 .xlsx 文件保存到临时文件夹中。我的代码在本地运行,但是当我发布到 Azure 时,我收到一条错误消息。

string projectDirectory = Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName + @"\temp\";
string tempFilename = "abc.xlsx";
string pathTradeRecFile = Path.Combine(projectDirectory, tempFilename);
Run Code Online (Sandbox Code Playgroud)

我的错误信息。<--- 访问路径“C:\Program Files (x86)\SiteExtensions\temp\abc.xlsx”被拒绝。

有人可以告诉我如何将此文件保存在某处吗?我在我的结构中创建了一个名为“temp”的文件夹作为一种可能的解决方案,但我似乎无法访问它。

任何帮助将不胜感激!!

c# azure azure-functions

7
推荐指数
1
解决办法
1万
查看次数

ASP.NET Core - System.Text.Json:如何拒绝有效负载中的未知属性?

ASP.NET Core 7 中的 Web API 与 System.Text.Json:

我需要拒绝 PUT/POST API 上的 JSON 有效负载,这些 API 指定了其他属性,这些属性不映射到模型中的任何属性。

所以如果我的模型是

public class Person {
  public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我需要拒绝任何如下所示的有效负载(带有 400-Bad Request 错误)

{
  "name": "alice",
  "lastname": "bob"
}
Run Code Online (Sandbox Code Playgroud)

如何才能实现这一目标?

c# asp.net-core system.text.json

7
推荐指数
1
解决办法
1317
查看次数