我可以生成令牌,但尝试验证令牌失败,错误承载未通过身份验证.失败消息:No SecurityTokenValidator可用于令牌:{token}
在这一点上,我已经把所有东西都删除了,并且具有以下几点:
project.json
{ "dependencies": { "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final","Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final","Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final","Microsoft.Extensions.Logging": "1.0.0-rc2-final","Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final","Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final","AspNet.Security.OAuth.Validation": "1.0.0-alpha1-final","AspNet.Security.OpenIdConnect.Server": "1.0.0-beta5-final","Microsoft.AspNetCore.Authentication": "1.0.0-rc2-final","Microsoft.AspNetCore.Authentication.JwtBearer": "1.0.0-rc2-final" },"tools": { "Microsoft.AspNetCore.Server.IISIntegration.Tools": { "version": "1.0.0-preview1-final","imports": "portable-net45+win8+dnxcore50" } },"frameworks": { "net461": { } },"buildOptions": { "emitEntryPoint": true,"preserveCompilationContext": true },"publishOptions": { "include": [ "wwwroot","Views","appsettings.json","web.config" ] },"scripts": { "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] } }
Startup.cs方法:
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddAuthorization(options => { options.AddPolicy(JwtBearerDefaults.AuthenticationScheme,builder => { builder. AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme). RequireAuthenticatedUser(). Build(); } ); } ); services.AddAuthentication(); services.AddDistributedMemoryCache(); services.AddMvc(); services.AddOptions(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); var jwtOptions = new JwtBearerOptions() { AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme,AutomaticAuthenticate = true,Authority = "http://localhost:5000/",Audience = "http://localhost:5000/",RequireHttpsMetadata = false }; jwtOptions.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration> ( MetadataAddress: jwtOptions.Authority + ".well-known/openid-configuration",configRetriever: new OpenIdConnectConfigurationRetriever(),docRetriever: new HttpDocumentRetriever { RequireHttps = false } ); app.UseJwtBearerAuthentication(jwtOptions); app.USEOpenIdConnectServer(options => { options.AllowInsecureHttp = true; options.AuthorizationEndpointPath = Microsoft.AspNetCore.Http.PathString.Empty; options.Provider = new OpenIdConnectServerProvider { OnValidateTokenRequest = context => { context.Skip(); return Task.FromResult(0); },OnGrantResourceOwnerCredentials = context => { var identity = new ClaimsIdentity(context.Options.AuthenticationScheme); identity.AddClaim(ClaimTypes.NameIdentifier,"[unique id]"); identity.AddClaim("urn:customclaim","value",OpenIdConnectConstants.Destinations.AccessToken,OpenIdConnectConstants.Destinations.IdentityToken); var ticket = new AuthenticationTicket( new ClaimsPrincipal(identity),new Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties(),context.Options.AuthenticationScheme); ticket.SetScopes("profile","offline_access"); context.Validate(ticket); return Task.FromResult(0); } }; }); app.UseMvc(); }
发送x-url编码POST到http://localhost:5000与grant_type = password,username = foo,password = bar生成预期的access_token.
我已经将[Authorize(“Bearer”)]属性添加到ValuesController中,并且在JwtBearerMiddle中被调用时正常工作,但是我无法获取令牌进行验证.
有没有人有这个工作与.net核心RC2?我在RC1上有同样的事情,但一直无法得到这个结果.
谢谢.
解决方法
>使用开发的new OAuth2 validation middleware来支持不透明令牌(推荐的选项,如果您的API和您的授权服务器是同一应用程序的一部分).为此,请保留您在project.json中的AspNet.Security.OAuth.Validation引用,并通过app.USEOAuthValidation()替换app.UseJwtBearerAuthentication(…).您也可以从project.json中删除Microsoft.AspNetCore.Authentication.JwtBearer.
>强制OpenID Connect服务器中间件通过调用options来使用JWT令牌.AccessTokenHandler = new JwtSecurityTokenHandler();在选项中.请注意,您还必须致电ticket.SetResources(…)以将适当的受众附加到JWT令牌(有关详细信息,请参阅此处SO post).
>使用new introspection middleware.此选项更复杂,需要实施ValidateIntrospectionRequest事件来验证客户端凭据.只有当你知道你在做什么,才能使用它.