gpt4 book ai didi

.net - WebApi : User. Identity.IsAuthenticated 第一次请求为真,之后为假

转载 作者:行者123 更新时间:2023-12-02 02:01:23 24 4
gpt4 key购买 nike

我已经实现了一个 Web API。

<authentication mode="None" />

我正在使用基本授权,并在我的 AuthorizeAttribute 中设置 Thread.CurrentPrincipal。

第一次启动/调试应用程序后,我提交请求,在服务器端设置 Thread.CurrentPrincipal(IsAuthenticated = true),IsAuthenticated 在我的 Controller 中返回 true,正如预期的那样。然而,此后的任何请求都会将 Thread.CurrentPrincipal 设置为正常,但当执行命中我的 Controller 方法时, Controller 的 User.Identity 属性已更改,并且 IsAuthenticated = false。

我无法弄清楚为什么在启动应用程序后第一次 IsAuthenticated=true ?!每次都应该如此,因为我手动设置了 Thread.CurrentPrinciple,但在到达我的 Controller 之间的某处,它正在被替换!

更新

这与我添加的 MediaTypeFormatter 有关。当我删除格式化程序时,我没有遇到问题。执行的格式化程序代码如下:

public override Task<object> ReadFromStreamAsync(Type type, System.IO.Stream webStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger)
{
return Task.Factory.StartNew(() =>
{
string temporaryFilePath = Path.Combine(TemporaryDirectory, Path.GetRandomFileName());

using (FileStream fileStream = new FileStream(temporaryFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.Read))
{
webStream.CopyTo(fileStream);
}

return (object)new CustomFile(temporaryFilePath);
});
}

最佳答案

答案解释得比较详细here .

简而言之,仅设置 Thread.CurrentPrincipal 是不够的。我现在也设置了 HttpContext.Current.User,它正在工作。

在原来的帖子中,调用了 MediaTypeFormatter 上的异步方法,创建了额外的线程,导致 CurrentPrinciple 被附加到其他线程,而不是你的 Controller 操作最终被执行的线程。

至于为什么要设置在两个地方,解释可以看here .它说:

If your application performs any custom authentication logic, you must set the principal on two places:

Thread.CurrentPrincipal: This property is the standard way to set the thread's principal in .NET. HttpContext.Current.User: This property is specific to ASP.NET.

The following code shows how to set the principal:

private void SetPrincipal(IPrincipal principal)
{
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
{
HttpContext.Current.User = principal;
}
}

For web-hosting, you must set the principal in both places; otherwise the security context may become inconsistent. For self-hosting, however, HttpContext.Current is null. To ensure your code is host-agnostic, therefore, check for null before assigning to HttpContext.Current, as shown.

关于.net - WebApi : User. Identity.IsAuthenticated 第一次请求为真,之后为假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17089207/

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