Failed to load http://localhost:5000/.well-known/openid-configuration: No 'Access-Control-Allow-Origin' header is present on the requested resource
我是IdentityServer4的新手,最近我看到IdentityServer团队提供的QuickStart8示例,其中包括3个项目1.IdentityServer2。API 3.客户端在浏览器中工作正常,当我部署到IIS时,它们工作不正常,显示错误,如…
我正在使用javascript客户端…
请帮我解决这个问题。
这是我的密码…
api(启动.cs)
1 | using Microsoft.AspNetCore.Builder; |
使用Microsoft.Extensions.DependencyInjection;
命名空间API{公共类启动{公共void配置服务(ISeviceCollection服务){services.addmvcore()。.addauthorization()。.addjsonFormatters();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | services.AddAuthentication("Bearer") .AddIdentityServerAuthentication(options => { options.Authority ="http://localhost:5000"; options.RequireHttpsMetadata = false; options.ApiName ="api1"; }); services.AddCors(options => { // this defines a CORS policy called"default" options.AddPolicy("default", policy => { policy.WithOrigins("http://localhost:5003") .AllowAnyHeader() .AllowAnyMethod(); }); }); } public void Configure(IApplicationBuilder app) { app.UseCors("default"); app.UseAuthentication(); app.UseMvc(); } } |
}
API(身份控制器)
1 2 3 4 5 6 7 8 9 10 |
QuickStartIdentityServer(startup.cs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(); string connectionString = @"Data Source=DOTNET-Foo;Initial Catalog=IdentityServer4;Integrated Security=True"; var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; // configure identity server with in-memory stores, keys, clients and scopes services.AddIdentityServer() .AddDeveloperSigningCredential() .AddTestUsers(Config.GetUsers()) // this adds the config data from DB (clients, resources) .AddConfigurationStore(options => { options.ConfigureDbContext = builder => builder.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly)); }); // this adds the operational data from DB (codes, tokens, consents) //.AddOperationalStore(options => //{ // options.ConfigureDbContext = builder => // builder.UseSqlServer(connectionString, // sql => sql.MigrationsAssembly(migrationsAssembly)); // // this enables automatic token cleanup. this is optional. // options.EnableTokenCleanup = true; // options.TokenCleanupInterval = 30; //}); services.AddAuthentication() .AddGoogle("Google", options => { options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; options.ClientId ="434483408261-55tc8n0cs4ff1fe21ea8df2o443v2iuc.apps.googleusercontent.com"; options.ClientSecret ="3gcoTrEDPPJ0ukn_aYYT6PWo"; }) .AddOpenIdConnect("oidc","OpenID Connect", options => { options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; options.SignOutScheme = IdentityServerConstants.SignoutScheme; options.Authority ="https://demo.identityserver.io/"; options.ClientId ="implicit"; options.TokenValidationParameters = new TokenValidationParameters { NameClaimType ="name", RoleClaimType ="role" }; }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); // IdentityServerDatabaseInitialization.InitializeDatabase(app); } app.UseIdentityServer(); app.UseStaticFiles(); app.UseMvcWithDefaultRoute(); } } |
我无法访问http://localhost:5000/。已知/openid配置
我认为当您从IIS运行项目时,示例不再有效,因为地址或更准确地说端口不相同。
在IIS Express中运行时使用的端口当您通过Visual Studio运行项目或使用
IdentityServer 托管在http://localhost:5000 链路上,与launchSettings.json 相连。JavaScriptClient 托管在http://localhost:5003 端口-连接到launchSettings.json 的链路上。Api 可通过http://localhost:5002 链接访问launchSettings.json 。
关联的配置
知道了这一点,有一些配置设置开始发挥作用;让我们一起讨论它们。
IdentityServer中的客户端设置定义客户机(即将其身份验证联合到IdentityServer的应用程序)时,需要指定一些内容,例如:
- 哪个URL是IdentityServer,允许在登录或注销后重定向用户;
- 如果这是一个JS客户机,那么应该允许浏览器从该客户机启动授权请求。
这可以在这里的
您会注意到,该配置中指定的所有URL都指向使用IIS Express时托管
由于在本例中,JS客户端直接向IdentityServer发出请求,因此在JS应用程序本身中定义了一些设置;我们可以在
authority 是标识服务器URL—当我们使用IIS Express时,localhost:5000 是正确的。redirect_uri 和post_logout_redirect_uri 使用localhost:5003 ,这是我们使用IIS Express时的JS客户端URL。
同样,当您使用IIS时,您需要更新所有这些值,以匹配承载两个应用程序的URL。
API配置此示例显示JS客户机如何向API发出请求,并让它将令牌发送到IdentityServer以进行验证。
这里涉及到一些设置:
- JS客户端需要知道API的URL——这在JS客户端的
app.js 中再次定义。 - API需要知道如何访问IdentityServer—我们将在API的
Startup.cs 中找到它。 - API需要允许浏览器通过CORS策略向其端点发出Ajax请求,这同样在API项目中的
Startup 类中完成。
再次,您需要更新所有这些URL,以匹配将项目部署到IIS时使用的URL。
希望我没有错过任何东西;—)
最后,我为用户的IIS AppPoolidService授予了登录失败的SQL登录权限,解决了这个问题。
您不需要在这里做任何特殊的事情,ISD4可以很好地处理COR。您需要在CORS源文件中为客户机配置指定http://localhost:5003。IDS4将接收此消息并允许向发现端点发出请求。