小编tha*_*ssd的帖子

使用 HttpClient.GetFromJsonAsync(),如何在没有额外 SendAsync 调用的情况下处理基于 HttpStatusCode 的 HttpRequestException?

System.Net.Http.JsonHttpClient扩展方法,例如GetFromJsonAsync()大大简化了从 Web API 检索 json 对象的例程代码。使用起来很愉快。

但是由于它的设计方式(直接返回反序列化对象),它不会产生任何HttpResponseMessage用于检查的内容,从而允许我基于HttpStatusCode.

相反,不成功的状态代码会导致HttpRequestException,它似乎没有提供任何公开强类型的属性HttpStatusCode。相反,状态代码包含在异常的Message字符串本身中。

编辑:.NET 5.0 添加了该HttpRequestException.StatusCode属性,因此现在可以在调用GetFromJsonAsync.

//下面的旧帖子

所以我一直在做这样的事情:

try
{
  var cars = await httpClient.GetFromJsonAsync<List<Car>>("/api/cars");
  //...
}
            
catch (HttpRequestException ex)
{
   if (ex.Message.Contains(HttpStatusCode.Unauthorized.ToString()))
   {
     //Show unauthorized error page...
   }
   //...
}
Run Code Online (Sandbox Code Playgroud)

这感觉有点hacky。使用老派的创建HttpRequestMessage和调用方式SendAsync,我们自然有机会检查响应的HttpResponseMessage.StatusCode. 添加其中一些代码会破坏在System.Net.Http.Json.

这里的任何建议将不胜感激。

c# asp.net-web-api dotnet-httpclient asp.net-core

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

Blazor 的 IDbContextFactory:何时使用 CreateDbContextAsync 异步版本与 CreateDbContext

IDbContextFactory.CreateDbContext我在处理 Blazor 服务器项目时开始使用。我知道此接口是为 Blazor 创建的,旨在解决有状态 Blazor 服务器应用程序中的 DbContext 并发问题。

到目前为止我一直在做

using var context = _contextFactory.CreateDbContext();
//Then use the context...
Run Code Online (Sandbox Code Playgroud)

但我刚刚发现该方法有一个异步版本,IDbContextFactory.CreateDbContextAsync文档只是说“在异步上下文中创建新的 DbContext 实例”。

所以我的问题是我应该更喜欢一个版本而不是另一个版本吗?上下文创建是否是一个昂贵/可能阻塞的操作,需要异步操作?

entity-framework entity-framework-core blazor blazor-server-side

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

是否可以将系统托管标识分配给需要用户分配的 Azure AD 企业应用程序?

我有一个 Azure Function 应用程序,它使用通过 Azure 门户配置的集成 Azure AD 身份验证。

通过“快速”模式设置,这将创建 Azure 应用程序注册以及企业应用程序。

默认情况下,此企业应用程序接受所有用户。因此,这意味着租户中的所有用户都可以触发受保护的 Azure Functions,这不是我想要的。

我的目标是允许租户中具有托管标识(例如应用服务)的某些用户和某些 Azure 资源触发该功能。

因此,我转到 Azure Function 应用程序的企业应用程序设置,将其属性更改为“需要用户分配”。然后在“用户/组”下,我可以添加允许进行身份验证的用户/组。

这里我发现我只能添加普通AAD用户。托管身份服务主体(即系统为我的应用服务分配的托管身份主体)未显示在列表中。

我还没有尝试过用户分配的托管身份。但我更喜欢使用系统分配的托管身份。

这是受支持的场景吗?

azure-active-directory azure-functions azure-authentication azure-managed-identity

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

在 ASP.NET Core razor 页面中跨帖子和重定向保留现有查询字符串的最简单方法是什么?

我有一个 ASP.NET Core razor 页面和模型,它使用查询字符串来过滤搜索结果并通过 GET 进行分页。

考虑用户执行搜索以到达此页面:

https://localhost/Users?searchBy=Name&searchTerm=test&resultPage=2

现在,在结果页面上,我有一个通过弹出模式执行删除的按钮。当用户单击删除时,它会 POSTS 到页面处理程序OnPostDelete()asp-page-handler我为此使用标签助手:

<button asp-page-handler="Delete" asp-route-id="@Model...">

删除后,我希望用户被重定向回与之前完全相同的 URL,因此他/她保留在相同的结果页面上,而不是被重定向到普通索引页面。

所以我的问题是如何在整个帖子和重定向过程中轻松地保留这些查询字符串?目前这是我正在做的事情:

在删除弹出模态剃刀页面上,我使用这些代码来捕获当前查询字符串:(我不知道如何直接转换Context.Request.Query为 a Dictionary

@{ 
    Dictionary<string, string> query = new Dictionary<string, string>();

    foreach (var queryString in Context.Request.Query)
    {
        query.Add(queryString.Key, queryString.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我将查询添加到asp-all-route-data删除按钮上的标签助手:

<button asp-page-handler="Delete" asp-all-route-data="query" asp-route-id="@Model...">

这使得标签助手生成的结果formaction属性包含 POST URL 中的查询字符串。

然后在我的页面处理程序的OnPostDelete()方法中,我再次重新捕获查询字符串,在重定向之前删除由删除按钮添加的不需要的字符串(id 等):

 Dictionary<string, string> query = new Dictionary<string, string>();
            
 foreach (var queryString in HttpContext.Request.Query)
 {
     if ((queryString.Key != "id") …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc asp.net-core razor-pages

5
推荐指数
1
解决办法
3914
查看次数

如何在 ASP.NET Core 中使用 .AddOpenIdConnect() 向 Google 请求离线访问?

我知道微软提供了一个谷歌特定的OIDC包( Microsoft.AspNetCore.Authentication.Google),它有一个选项.AddGoogle()来指定AccessType可以设置为offline.

但这可以使用标准 ASP.NET Core OIDC 包Microsoft.AspNetCore.Authentication.OpenIdConnect来完成吗.AddOpenIdConnect()

使用 Microsoft 帐户,我们可以简单地请求offline_access范围,并且效果完美。但它不适用于 Google,并会导致错误invalid_scope

asp.net google-openid asp.net-identity openid-connect asp.net-core

5
推荐指数
1
解决办法
539
查看次数

我们是否应该在类背后的 Blazor 代码中使用属性或私有字段?

在 Blazor 中,某些东西(例如注入的对象和参数)必须使用属性,这部分很清楚。

但是那些用于控制页面内容和流程的特定于页面的变量(例如数据/DTO 和杂项字符串/布尔值等)又如何呢?

是使用自动属性(公共还是私有?)还是私有字段更好?

我问这个问题是因为在与 Blazor 相关的各种示例、教程和文档中,属性和字段的使用无处不在。我似乎找不到任何关于此的官方最佳实践指南。

c# asp.net-core blazor blazor-server-side

5
推荐指数
0
解决办法
1316
查看次数

查看从文档和模板获取 Azure Functions 6 中的 ILogger 的多种方法,有什么区别?

我正在使用 Azure Functions 6(.NET 6,隔离),并启用了 Application Insights。

从不同版本的 Visual Studio、Azure Functions Core Tools、默认的 Microsoft 模板和其他文档中展示了获取ILogger. 我见过:

  1. 构造函数注入ILoggerFactory(来自默认的 MS 模板):
private readonly ILogger _logger;

public MyFunction(ILoggerFactory loggerFactory)
{
    _logger = loggerFactory.CreateLogger<MyFunction>();
}
Run Code Online (Sandbox Code Playgroud)
  1. 从(也从默认的 MS 模板)获取FunctionContext
public async Task<HttpResponseData> Run([HttpTrigger(...)] HttpRequestData req, FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("MyFunction);
}
Run Code Online (Sandbox Code Playgroud)
  1. ILogger直接注入到Run方法中:
public static void Run(EventGridEvent eventGridEvent, ICollector<string> outputSbMsg, ILogger logger)

Run Code Online (Sandbox Code Playgroud)
  1. 常规 ASP.NET Core 构造函数注入ILogger<T>
private readonly ILogger<MyFunction> _logger;

public MyFunction(ILogger<MyFunction> logger) …
Run Code Online (Sandbox Code Playgroud)

c# azure-application-insights azure-functions azure-functions-runtime .net-6.0

5
推荐指数
1
解决办法
2547
查看次数

在 OpenID Connect 中,当“代码”流更安全地执行相同的操作时,“代码 id_token”混合工作流的目的是什么?

在学习使用 OpenID Connect/OAuth2 的 ASP.NET 身份安全课程时,我了解了不同工作流程的差异和优缺点。

具体来说,我对混合工作流程的目的感到困惑code id_token,它就像授权代码工作流程一样,只不过它还id_token从前通道返回(简化的)。

所以我的第一个问题是id_token,如果稍后要通过反向通道再次检索完整的 id 令牌和访问令牌,那么首先由第一个(不太安全的)请求返回淡化的目的是什么?

另一件事是关于安全性:课程讲师提到,code id_token即使没有 PKCE 保护,混合工作流程也被认为是安全的,原因有两个:

  1. 初始值id_token包含一个c_hash将其与授权代码关联的值,以保护其免受授权代码泄漏/重放攻击

我的问题:由于这个首字母id_token以完全相同的方式与授权代码一起返回,如果授权代码被泄露,我们是否应该假设它id_token也被泄露,从而使这种保护无效?

  1. nonce字符串确保授权码一次性使用

我的问题:由于nonce是以纯文本形式包含在 URL 中,如果攻击者设法在合法用户之前将重定向响应连同授权代码一起发布到客户端,那么攻击就会成功,对吗?

鉴于这些,是否可以说具有 PKCE 保护(加上随机数)的授权代码工作流程比code id_token没有 PKCE 的混合工作流程更安全?

谢谢。

oauth-2.0 asp.net-identity openid-connect identityserver4

4
推荐指数
1
解决办法
2894
查看次数

如何防止 Azure API 管理将订阅密钥查询参数传递给逻辑应用?

我使用 Azure API 管理作为我的逻辑应用程序的前端。需要启用“需要订阅”设置,因为我们确实需要保护。但是,我们必须通过查询参数发送密钥,因为我们的调用应用程序仅支持 GET,而不支持 POST。

因此,我的 API 调用使用https://my.azure-api.net/myapi/manual/paths/invoke?subscription-key=mykey的格式发送到 Azure

现在,在 Azure API 设置中,我确实创建了一个策略集来删除“订阅密钥”查询参数上的操作,但问题是:

尽管该参数已从逻辑应用程序的请求正文中删除,但在深入研究逻辑应用程序中显示各种标头的“RAW”输出时,我们可以在这两个标头中看到订阅密钥:

 "X-WAWS-Unencoded-URL": "/myapi/manual/paths/invoke?subscription-key=xxx
 "X-Original-URL": /myapi/manual/paths/invoke?subscription-key=xxx
Run Code Online (Sandbox Code Playgroud)

换句话说,在删除参数之前,逻辑应用可以使用完整的原始查询 URL。这会将 API 订阅密钥公开给逻辑应用。

有什么解决方法吗?

azure azure-api-management azure-logic-apps

3
推荐指数
1
解决办法
3632
查看次数

异步 Main() 中等待行为的困惑

我正在通过 Andrew Troelsen 的书“Pro C# 7 With .NET and .NET Core”学习 C#。在第 19 章(异步编程)中,作者使用了这些示例代码:

        static async Task Main(string[] args)
        {
            Console.WriteLine(" Fun With Async ===>");             
            string message = await DoWorkAsync();
            Console.WriteLine(message);
            Console.WriteLine("Completed");
            Console.ReadLine();
        }
     
        static async Task<string> DoWorkAsync()
        {
            return await Task.Run(() =>
            {
                Thread.Sleep(5_000);
                return "Done with work!";
            });
        }
Run Code Online (Sandbox Code Playgroud)

作者接着说

"... this 关键字 (await) 将始终修改返回 Task 对象的方法。当逻辑流到达 await 标记时,调用线程将在此方法中挂起,直到调用完成。如果您要运行此版本在应用程序中,您会发现 Completed 消息显示在 Done with work! 消息之前。如果这是一个图形应用程序,用户可以在 DoWorkAsync() 方法执行时继续使用 UI”。

但是当我在 VS 中运行这段代码时,我没有得到这种行为。主线程实际上被阻塞了 5 秒,直到“完成工作!”之后才会显示“完成”。

查看有关 async/await 如何工作的各种在线文档和文章,我认为“await”会起作用,例如当遇到第一个“await”时,程序会检查该方法是否已经完成,如果没有,它会立即“ …

.net c# async-await

3
推荐指数
1
解决办法
419
查看次数

使用 Azure Function .NET5 和 HttpRequestData,如何处理文件上传(表单数据)?

较旧的 Azure 函数可以访问HttpRequest,这允许我们通过req.Form.Files等访问上传​​的文件。

HttpRequestData而是使用隔离的 .NET5 Azure 函数,它不提供对Form. 如何提取发布到该功能的上传文件?

.net c# azure-functions .net-5

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