从持有人令牌(Web API)获取身份声明

时间:2017-06-08 11:27:53

标签: asp.net asp.net-web-api claims-based-identity bearer-token

我有两个带有共享machine.key的Web API。我想将第一个Web API生成的持有者令牌作为参数(即token = xxxxxxxx)传递给第二个Web API,并从中提取身份声明(即userId)。

这可能吗?我看了一遍,但似乎没有太多关于解析文本承载令牌以提取索赔的信息。

感谢。

1 个答案:

答案 0 :(得分:1)

如果您正在使用OWIN,则可以实现自己的OAuthBearerAuthenticationProvider,它从查询字符串中获取令牌并将其设置为上下文:

internal class MyAuthProvider : OAuthBearerAuthenticationProvider
{
    public override Task RequestToken(OAuthRequestTokenContext context)
        if (context.Token == null)
        {
            var value = context.Request.Query.Get("token");
            if (!string.IsNullOrEmpty(value))
            {
                context.Token = value;
            }
        }

        return Task.FromResult<object>(null);
    }
}

您可以在Startup.cs中使用它,如下所示:

public void Configuration(IAppBuilder app)
{
    // All the other stuff here

    var audience = "";
    var secret = "...";

    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
    {
        Provider = new MyAuthProvider(),
        AuthenticationMode = AuthenticationMode.Active,
        AllowedAudiences = new [] { audience },
        IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
        {
            new SymmetricKeyIssuerSecurityTokenProvider("MyApp", TextEncodings.Base64Url.Decode(key))
        }
    });

    // All the other stuff here
}

当您像这样实现身份验证时,可以通过User.Identity属性访问WebApi控制器中的令牌信息。要阅读自定义声明,您可以将其投射到ClaimsIdentity

var identity = User.Identity as ClaimsIdentity;
var myClaim = identity.Claims.FirstOrDefault(c => c.Type == "myClaimKey");