我正在尝试使用IdentityServer3.AccessTokenValidation验证从IDS4生成的令牌,但是每次都会收到401。
我遵循了我在其他文章中看到的建议:
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var executingAssembly = Assembly.GetExecutingAssembly();
Api.Register(builder, executingAssembly);
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
builder.RegisterAssemblyModules(executingAssembly);
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
var webApiResolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;
app.UseCors(CorsOptions.AllowAll);
app.UseAutofacWebApi(config);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
var options = new IdentityServerBearerTokenAuthenticationOptions
{
Authority = ConfigurationManager.AppSettings["IdentityServer:Authority"],
AuthenticationType = "Bearer",
RequiredScopes = new[] { ConfigurationManager.AppSettings["IdentityServer:ApiScope"] },
};
app.UseIdentityServerBearerTokenAuthentication(options);
WebApiConfig.Register(config);
config.Filters.Add(new AuthorizeAttribute());
app.UseWebApi(config);
}
这应该授权我从应用发送的令牌,但是 授权适用于所有控制器,但是我看到控制器的构造函数被击中,但未调用该动作,这是否意味着令牌验证工作正常? 但我看到我要发送的授权也是正确的。
打开katana日志记录后出现以下错误:
IdentityServer3.AccessTokenValidation.ValidationEndpointTokenProvider信息:0:从令牌验证端点返回的错误:找不到 Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware警告:0:收到无效的承载令牌
答案 0 :(得分:0)
您将需要ClientId和Client Secret-Api是一种资源,但是由于您使用的是参考令牌,因此需要这样的东西:
{
Authority = "https://idsrvurl:44333/core",
RequiredScopes = new[] { "api1" },
ClientId = "api1",
ClientSecret = "secret"
});
答案 1 :(得分:0)
我在这个问题上花了很多时间。上面列出的解决方案在其他许多文章中都有,但是对我不起作用。
我添加了对Katana的跟踪,这很有帮助。我加了:
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="Microsoft.Owin">
<listeners>
<add name="KatanaListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="KatanaListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="katana.trace.log" traceOutputOptions="ProcessId, DateTime" />
</sharedListeners>
<switches>
<add name="Microsoft.Owin" value="Verbose" />
</switches>
搜索这些错误后,发现这篇文章解决了我的问题:https://github.com/IdentityServer/IdentityServer4/issues/3705
我必须更改IdServer4,以便它将使用JWT令牌而不是at + jwt。我还启用了EmitLegacyResourceAudienceClaim。
稍后,我在我的webapi中添加了IdentityServer3.Contrib.AccessTokenValidation,以便它接受JWT的显式输入(at + jwt)。