gpt4 book ai didi

c# - 异步设置 Thread.CurrentPrincipal?

转载 作者:可可西里 更新时间:2023-11-01 09:08:11 27 4
gpt4 key购买 nike

使用 ASP.NET WebAPI,在身份验证期间设置 Thread.CurrentPrincipal,以便 Controller 稍后可以使用 ApiController.User 属性。

如果该身份验证步骤变为异步(查询另一个系统),则 CurrentPrincipal 的任何变更都会丢失(当调用者的 await 恢复同步上下文时)。

这是一个非常简化的示例(在实际代码中,身份验证发生在操作过滤器中):

using System.Diagnostics;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;

public class ExampleAsyncController : System.Web.Http.ApiController
{
public async Task GetAsync()
{
await AuthenticateAsync();

// The await above saved/restored the current synchronization
// context, thus undoing the assignment in AuthenticateAsync().
Debug.Assert(User is GenericPrincipal);
}

private static async Task AuthenticateAsync()
{
// Save the current HttpContext because it's null after await.
var currentHttpContext = System.Web.HttpContext.Current;

// Asynchronously determine identity.
await Task.Delay(1000);
var identity = new GenericIdentity("<name>");

var roles = new string[] { };
Thread.CurrentPrincipal = new GenericPrincipal(identity, roles);
currentHttpContext.User = Thread.CurrentPrincipal;
}
}

如何在异步函数中设置 Thread.CurrentPrincipal,以便调用方的 await 在恢复同步上下文时不会丢弃该突变?

最佳答案

您还必须设置 HttpContext.Current.User。参见 this answerthis blog post了解更多信息。

更新:还要确保您在 .NET 4.5 上运行并将 UserTaskFriendlySynchronizationContext 设置为 true

关于c# - 异步设置 Thread.CurrentPrincipal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16552539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com