使用 AspNet.Security.OpenIdConnect.Server (ASP.NET vNext) 实现自定义主体
Materializing Custom Principal With AspNet.Security.OpenIdConnect.Server (ASP.NET vNext)
我正在使用 Visual Studio 2015 Enterprise 和 ASP.NET vNext Beta8 来构建一个端点,该端点可以发布和使用 JWT 令牌,如详细所述 。
我正处于我的项目阶段,我想允许 JWT 不记名身份验证按照上面提到的文章中的讨论进行,但是一旦令牌已经过身份验证,我想:
- JWT 身份验证成功后介入并检查其各种声明。
- 根据我在令牌中找到的内容,混合我自己的主体对象(比如 IContosoPrincipal)的作用域实例。
- 确保 IContosoPrincipal 的支持具体在当前请求范围内。
- 依赖项稍后将 IContosoPrincipal 注入到我的一个受令牌保护的控制器中。
我确定这将涉及一个作用域 IContosoPrincipal 对象,我可能会弄清楚那部分,但我不确定如何拦截 JWT 身份验证在 令牌是成功验证但在 controller/action 调用发生之前。
任何有关如何处理此问题的建议都将不胜感激。
自定义 principals/identities 在 ASP.NET 中没有(也不会)得到官方支持 5. 您可以找到有关此主题的更多信息:https://github.com/aspnet/Security/issues/323.
相反,我们强烈建议您将所需的数据存储为单独的声明,并在需要时提供围绕 ClaimsIdentity
/ClaimsPrincipal
的扩展方法(例如,如果您需要格式化声明值).
FWIW,此模式被 ASP.NET Identity 3 本身大量使用,它带有内置扩展(如 GetUserName
或 GetUserId
),您可以在自己的中使用代码:
/// <summary>
/// Returns the User ID claim value if present otherwise returns null.
/// </summary>
/// <param name="principal">The <see cref="ClaimsPrincipal"/> instance this method extends.</param>
/// <returns>The User ID claim value, or null if the claim is not present.</returns>
/// <remarks>The User ID claim is identified by <see cref="ClaimTypes.NameIdentifier"/>.</remarks>
public static string GetUserId(this ClaimsPrincipal principal)
{
if (principal == null)
{
throw new ArgumentNullException(nameof(principal));
}
return principal.FindFirstValue(ClaimTypes.NameIdentifier);
}
https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity/PrincipalExtensions.cs
我正在使用 Visual Studio 2015 Enterprise 和 ASP.NET vNext Beta8 来构建一个端点,该端点可以发布和使用 JWT 令牌,如详细所述
我正处于我的项目阶段,我想允许 JWT 不记名身份验证按照上面提到的文章中的讨论进行,但是一旦令牌已经过身份验证,我想:
- JWT 身份验证成功后介入并检查其各种声明。
- 根据我在令牌中找到的内容,混合我自己的主体对象(比如 IContosoPrincipal)的作用域实例。
- 确保 IContosoPrincipal 的支持具体在当前请求范围内。
- 依赖项稍后将 IContosoPrincipal 注入到我的一个受令牌保护的控制器中。
我确定这将涉及一个作用域 IContosoPrincipal 对象,我可能会弄清楚那部分,但我不确定如何拦截 JWT 身份验证在 令牌是成功验证但在 controller/action 调用发生之前。
任何有关如何处理此问题的建议都将不胜感激。
自定义 principals/identities 在 ASP.NET 中没有(也不会)得到官方支持 5. 您可以找到有关此主题的更多信息:https://github.com/aspnet/Security/issues/323.
相反,我们强烈建议您将所需的数据存储为单独的声明,并在需要时提供围绕 ClaimsIdentity
/ClaimsPrincipal
的扩展方法(例如,如果您需要格式化声明值).
FWIW,此模式被 ASP.NET Identity 3 本身大量使用,它带有内置扩展(如 GetUserName
或 GetUserId
),您可以在自己的中使用代码:
/// <summary>
/// Returns the User ID claim value if present otherwise returns null.
/// </summary>
/// <param name="principal">The <see cref="ClaimsPrincipal"/> instance this method extends.</param>
/// <returns>The User ID claim value, or null if the claim is not present.</returns>
/// <remarks>The User ID claim is identified by <see cref="ClaimTypes.NameIdentifier"/>.</remarks>
public static string GetUserId(this ClaimsPrincipal principal)
{
if (principal == null)
{
throw new ArgumentNullException(nameof(principal));
}
return principal.FindFirstValue(ClaimTypes.NameIdentifier);
}
https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity/PrincipalExtensions.cs