![](/img/trans.png)
[英]Custom SynchronizationContext to set Thread.CurrentPrincipal asynchronously in unittest
[英]Set Thread.CurrentPrincipal Asynchronously?
使用ASP.NET WebAPI,在身份验证期间,设置Thread.CurrentPrincipal
,以便控制器稍后可以使用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
不会丢弃该突变?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.