我有两个带有共享machine.key的Web API。我想将第一个Web API生成的持有者令牌作为参数(即token = xxxxxxxx)传递给第二个Web API,并从中提取身份声明(即userId)。
这可能吗?我看了一遍,但似乎没有太多关于解析文本承载令牌以提取索赔的信息。
感谢。
答案 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");