异步设置Thread.CurrentPrincipal?对于ASP.NETWebAPI,在身份验证期间设置Thread.CurrentPrincipal,以便控制器稍后可以使用ApiController.User属性。如果该身份验证步骤变为异步(查询另一个系统),则CurrentPrincipal的任何变更都会丢失(当调用者等待恢复同步上下文时)。这是一个非常简化的示例(在实际代码中,身份验证发生在操作过滤器中):使用System.Security.Principal;使用系统线程;使用System.Threading.Tasks;公共类ExampleAsyncController:System.Web.Http.ApiController{publicasyncTaskGetAsync(){awaitAuthenticateAsync();//上面的await保存/恢复了当前同步//上下文,从而撤消了AuthenticateAsync()中的分配。Debug.Assert(用户是GenericPrincipal);}privatestaticasyncTaskAuthenticateAsync(){//保存当前的HttpContext,因为它在await后为null。varcurrentHttpContext=System.Web.HttpContext.Current;//异步确定身份。等待Task0.Delay);var(100identity=newGenericIdentity("");varroles=newstring[]{};Thread.CurrentPrincipal=newGenericPrincipal(identity,roles);currentHttpContext.User=Thread.CurrentPrincipal;}}如何设置Thread.CurrentPrincipal在asyncfunction中,以便调用者的await在恢复同步上下文时不会丢弃突变?您还必须设置Http有关Context.Current.User的详细信息,请参阅此答案和此博客文章。更新:还要确保您在.NET4.5上运行并将UserTaskFriendlySynchronizationContext设置为true。以上就是C#学习教程:异步设置Thread.CurrentPrincipal?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
