2

我正在使用 Visual Studio 2015 Enterprise 和 ASP.NET vNext Beta8 构建一个端点,该端点发出和使用 JWT 令牌,如此处详细描述

我正处于项目的阶段,我希望允许 JWT 不记名身份验证按照上述文章中的讨论进行,但是一旦令牌通过身份验证,我想:

  • 在成功进行 JWT 身份验证后介入并检查其各种声明。
  • 根据我在令牌中找到的内容,水合我自己的主体对象(比如 IContosoPrincipal)的范围实例。
  • 确保 IContosoPrincipal 的支持具体范围仅限于当前请求。
  • 稍后将依赖项注入 IContosoPrincipal 到我的一个令牌保护控制器中。

我确信这将涉及一个范围内的 IContosoPrincipal 对象,我可能会弄清楚这部分,但我不确定如何在令牌成功验证之后但在控制器/动作调用发生之前拦截 JWT 验证。

任何有关如何解决此问题的建议将不胜感激。

4

1 回答 1

3

ASP.NET 5 不(也不会)正式支持自定义主体/身份。您可以找到有关此主题的更多信息:https ://github.com/aspnet/Security/issues/323 。

相反,强烈建议您将所需的数据存储为单独的声明,并在需要时提供扩展方法ClaimsIdentityClaimsPrincipal例如,如果您需要格式化声明值)。

FWIW,这种模式被 ASP.NET Identity 3 本身大量使用,它带有内置扩展(如GetUserNameor 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

于 2015-11-04T17:43:19.680 回答