无法使用IdentityServer3.AccessTokenValidation验证令牌

时间:2019-06-01 11:02:48

标签: .net owin identityserver3

我正在尝试使用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:收到无效的承载令牌

2 个答案:

答案 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)。