gpt4 book ai didi

c# - 为什么我的 ClaimsIdentity IsAuthenticated 总是错误的(对于 web api 授权过滤器)?

转载 作者:IT王子 更新时间:2023-10-29 03:44:03 26 4
gpt4 key购买 nike

在 Web API 项目中,我覆盖了正常的身份验证过程以检查 token 。代码看起来像这样:

if ( true ) // validate the token or whatever here
{
var claims = new List<Claim>();
claims.Add( new Claim( ClaimTypes.Name, "MyUser" ) );
claims.Add( new Claim( ClaimTypes.NameIdentifier, "MyUserID" ) );
claims.Add( new Claim( ClaimTypes.Role, "MyRole" ) );

var claimsIdentity = new ClaimsIdentity( claims );

var principal = new ClaimsPrincipal( new[] { claimsIdentity } );
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
}

然后当我将 [Authorize] 属性应用于 Controller 时,它无法授权。

调试代码确认相同的行为:

// ALWAYS FALSE!
if ( HttpContext.Current.User.Identity.IsAuthenticated ) {
// do something
}

为什么即使我已经构造了一个有效的 ClaimsIdentity 并将其分配给线程,它仍认为用户未通过身份验证?

最佳答案

问题是由于 .Net 4.5 中的重大更改。正如 this article 所解释的那样,简单地构造声明身份不再使 IsAuthenticated 返回 true。相反,您需要将一些字符串(无关紧要)传递给构造函数。

所以上面代码中的这一行:

var claimsIdentity = new ClaimsIdentity( claims );

变成这样:

// exact string doesn't matter
var claimsIdentity = new ClaimsIdentity( claims, "CustomApiKeyAuth" );

然后问题就解决了。 更新:请参阅 Leo 的其他回答。确切的 AuthenticationType 值可能重要也可能不重要,具体取决于您的身份验证管道中的其他内容。

更新 2:正如 Robin van der Knaap 在评论中所建议的那样,System.Security.Claims.AuthenticationTypes 值之一可能是合适的。

var claimsIdentity = new ClaimsIdentity( claims, AuthenticationTypes.Password );

// and elsewhere in your application...
if (User.Identity.AuthenticationType == AuthenticationTypes.Password) {
// ...
}

关于c# - 为什么我的 ClaimsIdentity IsAuthenticated 总是错误的(对于 web api 授权过滤器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20254796/

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