我有一个ASP.NET MVC应用程序和 我有一个用于身份验证的OAuth请求资源所有者密码流,如下所示:
public override async Task GrantResourceOwnerCredentials(
OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = (CustomUserManager)context.OwinContext.Get<>();
var user = await userManager
.FindAsync(context.UserName, context.Password)
.ConfigureAwait(false)
var ticket = new AuthenticationTicket(identity, properties);
context.Validated(ticket);
}
问题是:如果我没有ConfigureAwait(false),我正在设置死锁并且Task被取消了异常。 但是使用ConfigureAwait(false),一切正常。
但我的问题是在这种情况下使用ConfigureAwait(false)是否正确? 在这种情况下,可以使用ConfigureAwait(false)丢失上下文吗?
提前致谢。
答案 0 :(得分:1)
如果堆栈中的某些内容阻塞了异步代码,它应该只会死锁。可能是一个MVC过滤器,因为那些不能(还)是异步的。
只要ConfigureAwait(false)
构造函数和AuthenticationTicket
可以在ASP.NET请求上下文之外运行,就可以使用AuthenticationTicket.Validated
作为解决方法。我不知道他们能不能。
请注意,此时此类黑客攻击是短暂的; ASP.NET vNext将支持异步MVC动作过滤器,然后代码可以完全异步。