- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 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/
我最近将我的 ASP.NET 应用程序从 Azure 的 Active Directory 配置切换到 ASP.NET Identity。我在本地测试时没有遇到任何问题,但当我发布到 Azure 时,
我正在使用 Katana for OAuth 从他的 LinkedIn 个人资料中获取有关用户的数据。我想将从 LinkedIn 收到的所有数据放入用户的 ClaimsIdentity 对象中,这样我
我有一个在 ASP.Net MVC 中构建的 HR Web 应用程序,分为多个区域,例如经理、员工。这些区域代表系统中能够执行不同任务的不同类型的用户。涉及遗留数据库,每种用户类型的信息存储在不同的表
我正在开发一个新应用程序并使用 ASP.NET Identity,想知道是否有一种方法可以在 ClaimsIdentity 上强制显示特定的声明类型。到目前为止,这是我所拥有的。它可以工作,但似乎这是
到目前为止,我找到了两种从 ClaimsIdentity 获取 WindowsIdentity 对象的解决方案。首先,我提取用户主体名称 (upn)。 ClaimsIdentity ci = (Cla
我正在使用 OpenId Connect 基于 Azure Active Directory 构建用户身份验证。我可以使用我在 AAD 中的帐户成功登录到我的网站。登录后,我想通过 AAD 图形 AP
我使用透明代理,是否可以将声明身份传递给另一个 WebAPI? 我有两个 WebAPI,演示和应用程序,都使用 ADFS 进行身份验证。 到目前为止,我的代码用于处理对应用程序 WebAPI 的表示请
首先,更广泛的背景。 我正在开发一个由单独的网络 API 支持的网络应用程序。 Web 应用程序中的身份验证应基于 ActiveDirectory,并且应由 Web API 处理。 因此,Web 应用
我已经使用 azure 使用 MVC3 设置了我的声明,并且一切顺利。 我现在需要做的是扩展当前线程/http上下文中的Claims Identity并添加我自己的信息(DOB,地址..之类的东西)
在 VS 2012/.NET 4.5/ASP.NET MVC 4 应用程序中,我有一个从 ClaimsIdentity 派生的自定义身份类型。它只是向基类添加了一些只读属性,以便于从一些声明中读取值:
刚刚开始我的第一个 .net core 2 网络应用程序实现。不幸的是,由于业务需求,用户必须通过遗留表单登录进行身份验证,用户名/密码被处理到 oracle 数据库,当用户通过身份验证时,将生成一个
我想使用 JWT 保护 ASP.NET Core Web API。此外,我希望可以选择直接在 Controller 操作属性中使用 token 负载中的角色。 现在,虽然我确实找到了如何将其与策略一起
我正在查看 ASP.NET MVC 5 身份验证的新内容,并注意到现在一切都是 claim 身份 .我想知道这些值存储在哪里: Session、Cache 或 Cookie 本身。 如果它存储在 co
我有一个遗留应用程序,我正在尝试更新它以使用带 Owin 身份验证的 MVC 5。但是,我一直在尝试让 SecurityStamp 验证正常工作。我可能遗漏了拼图的一些基本部分,但我无法弄清楚它是什么
我有一个使用 IdentityServer4.TokenValidation 进行身份验证的 ASP.NET Core 2.1 应用程序 authenticationBuilder.AddIdenti
我使用 .NET 4.5 创建了一个新的 ASP.NET MVC 应用程序。我已成功设置 STS 身份验证。身份验证流程工作正常,我能够在 Thread.CurrentPrincipal 上获取包含所
我有一个在 vs2010 中开发的现有 .Net 4 解决方案,它使用用于定义当前请求的用户的 IIdentity 实现。我现在想使用 vs2012 继续它的开发。 我在 vs2012 中打开了解决方
我的前端 Web 应用程序 (MVC) 使用不记名 key (SAML) 向 WCF 后端服务验证自身。身份验证工作正常并且 ClaimsIdentity 对象设置正确。但是,ClaimsIdenti
我有一个允许使用表单登录和 Windows 身份验证登录的 MVC 站点。我使用自定义 MembershipProvider 对用户进行 Active Directory 身份验证,使用 System
使用 Azure 和引用此服务的客户端 Windows 应用程序创建了一个 WCF 服务作为 WebRole。云服务是指使用 Windows Identity Foundation 中提供的“动手实验
我是一名优秀的程序员,十分优秀!