关于c#:无法加载http:// localhost:5000 / .well-known / openid-configuration:请求的资源上没有’Access-Control-Allow-Origin’标头

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时,它们工作不正常,显示错误,如…

enter image description here

我正在使用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
[Route("[controller]")]
[Authorize]
public class IdentityController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
    }
}

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配置

enter image description here


我认为当您从IIS运行项目时,示例不再有效,因为地址或更准确地说端口不相同。

在IIS Express中运行时使用的端口

当您通过Visual Studio运行项目或使用dotnet run时,项目所在的URL由项目的Properties文件夹中名为launchSettings.json的文件驱动。

  • IdentityServer托管在http://localhost:5000链路上,与launchSettings.json相连。
  • JavaScriptClient托管在http://localhost:5003端口-连接到launchSettings.json的链路上。
  • Api可通过http://localhost:5002链接访问launchSettings.json

关联的配置

知道了这一点,有一些配置设置开始发挥作用;让我们一起讨论它们。

IdentityServer中的客户端设置

定义客户机(即将其身份验证联合到IdentityServer的应用程序)时,需要指定一些内容,例如:

  • 哪个URL是IdentityServer,允许在登录或注销后重定向用户;
  • 如果这是一个JS客户机,那么应该允许浏览器从该客户机启动授权请求。

这可以在这里的Config类中找到。

您会注意到,该配置中指定的所有URL都指向使用IIS Express时托管JavaScriptClient的位置;当部署到IIS时,您需要将这些URL更新为JS客户机的URL。

JS配置

由于在本例中,JS客户端直接向IdentityServer发出请求,因此在JS应用程序本身中定义了一些设置;我们可以在app.js文件中找到这些设置:

  • authority是标识服务器URL—当我们使用IIS Express时,localhost:5000是正确的。
  • redirect_uripost_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将接收此消息并允许向发现端点发出请求。