使用AspNet.Security.OpenIdConnect.Server(ASP.NET vNext)

时间:2015-11-03 23:02:23

标签: asp.net asp.net-core jwt iprincipal aspnet-contrib

我正在使用Visual Studio 2015 Enterprise和ASP.NET vNext Beta8来构建一个端点,该端点同时发布和使用JWT令牌,详见here

我正处于项目的阶段,我希望允许JWT承载认证继续进行,如上文所述,但是一旦令牌经过身份验证,我想:

  • 在成功进行JWT身份验证后进入并检查其各种声明。
  • 根据我在令牌中找到的内容,为我自己的主要对象(例如IContosoPrincipal)的作用域实例加水。
  • 确保IContosoPrincipal的背衬混凝土范围为当前请求。
  • 依赖关系将IContosoPrincipal注入我的一个令牌保护控制器。

我确定这会涉及到一个范围内的IContosoPrincipal对象,我可能会想出那个部分,但我不确定如何在成功之后拦截JWT身份验证经过身份验证但在控制器/操作调用发生之前。

非常感谢任何有关如何处理此事的建议。

1 个答案:

答案 0 :(得分:3)

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

相反,我们强烈建议您将所需的数据存储为个人声明,并在需要时提供ClaimsIdentity / ClaimsPrincipal周围的扩展方法(例如,如果您需要格式化声明值) )。

FWIW,ASP.NET身份3本身大量使用此模式,它带有内置扩展(如GetUserNameGetUserId),可以在您自己的代码中使用:

/// <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