代码之家  ›  专栏  ›  技术社区  ›  Terai

配置blazor wasm和单独的IdentityServer 4

  •  0
  • Terai  · 技术社区  · 6 年前

    我有一个名为Messenger的解决方案,它包含3个项目:

    1. 送信人识别服务器
    2. 送信人应用程序编程接口
    3. 送信人BlazorWasmClient

    这是我的IdentityServer启动。反恐精英:

    public class Startup
        {
            public IWebHostEnvironment Environment { get; }
            public IConfiguration Configuration { get; }
    
            public Startup(IWebHostEnvironment environment, IConfiguration configuration)
            {
                Environment = environment;
                Configuration = configuration;
            }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllersWithViews();
    
                // configures IIS out-of-proc settings (see https://github.com/aspnet/AspNetCore/issues/14882)
                services.Configure<IISOptions>(iis =>
                {
                    iis.AuthenticationDisplayName = "Windows";
                    iis.AutomaticAuthentication = false;
                });
    
                // configures IIS in-proc settings
                services.Configure<IISServerOptions>(iis =>
                {
                    iis.AuthenticationDisplayName = "Windows";
                    iis.AutomaticAuthentication = false;
                });
    
                services.AddDbContext<IdentityServerDbContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    
                services.AddIdentity<IdentityServerUser, IdentityRole>()
                    .AddEntityFrameworkStores<IdentityServerDbContext>()
                    .AddDefaultTokenProviders();
    
                var builder = services.AddIdentityServer(options =>
                {
                    options.Events.RaiseErrorEvents = true;
                    options.Events.RaiseInformationEvents = true;
                    options.Events.RaiseFailureEvents = true;
                    options.Events.RaiseSuccessEvents = true;
                })
                    .AddInMemoryIdentityResources(Config.Ids)
                    .AddInMemoryApiResources(Config.Apis)
                    .AddInMemoryClients(Config.Clients)
                    .AddAspNetIdentity<IdentityServerUser>();
    
                // not recommended for production - you need to store your key material somewhere secure
                builder.AddDeveloperSigningCredential();
            }
    
            public void Configure(IApplicationBuilder app)
            {
                if (Environment.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseStaticFiles();
    
                app.UseRouting();
                app.UseIdentityServer();
                app.UseAuthorization();
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapDefaultControllerRoute();
                });
            }
        }
    

    配置。反恐精英:

    public static class Config
        {
            public static IEnumerable<IdentityResource> Ids =>
                new IdentityResource[]
                {
                    new IdentityResources.OpenId(),
    
                    // let's include the role claim in the profile
                    new ProfileWithRoleIdentityResource(),
                    new IdentityResources.Email()
                };
    
    
            public static IEnumerable<ApiResource> Apis =>
                new ApiResource[]
                {
                    // the api requires the role claim
                    new ApiResource("messenger.api", "Messenger API", new[] { JwtClaimTypes.Role })
                };
    
            // machine to machine client (from quickstart 1)
            public static IEnumerable<Client> Clients =>
                new List<Client>
                {
                    new Client
                    {
                        ClientId = "messenger.blazorwasmclient",
                        AllowedGrantTypes = GrantTypes.Code,
                        RequirePkce = true,
                        RequireClientSecret = false,
                        AllowedCorsOrigins = { "https://localhost:5001" },
                        AllowedScopes = { "openid", "profile", "email", "messenger.api" },
                        RedirectUris = { "https://localhost:5001/authentication/login-callback" },
                        PostLogoutRedirectUris = { "https://localhost:5001/" },
                        Enabled = true
                    }
                };
        }
    

    在BlazorWasmClient中,我向程序中添加了AddOidcAuthentication方法。cs是这样的:

    public class Program
        {
            public static async Task Main(string[] args)
            {
                var builder = WebAssemblyHostBuilder.CreateDefault(args);
                builder.RootComponents.Add<App>("app");
    
                builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    
                builder.Services
                    .AddOidcAuthentication(options =>
                    {
                        builder.Configuration.Bind("oidc", options.ProviderOptions);
                        options.UserOptions.RoleClaim = "role";
                    })
                    .AddAccountClaimsPrincipalFactory<ArrayClaimsPrincipalFactory<RemoteUserAccount>>();
    
                await builder.Build().RunAsync();
            }
        }
    

    应用设置。json:

    {
      "oidc": {
        "Authority": "https://localhost:5000/",
        "ClientId": "messenger.blazorwasmclient",
        "DefaultScopes": [
          "openid",
          "profile",
          "email",
          "messenger.api"
        ],
        "PostLogoutRedirectUri": "/",
        "ResponseType": "code"
      }
    }
    

    但我不明白为什么每次启动解决方案时都会出现这样的错误消息: enter image description here

    0 回复  |  直到 6 年前
        1
  •  3
  •   agua from mars    6 年前

    您需要配置重定向URI,并且PostLogoutUri必须是ABOSolt URI,而不是相对的。URI必须与您在IdentityServer4客户端中设置的完全匹配:

    应用设置。json

    {
      "oidc": {
        "Authority": "https://localhost:5000/",
        "ClientId": "messenger.blazorwasmclient",
        "DefaultScopes": [
          "openid",
          "profile",
          "email",
          "messenger.api"
        ],
        "PostLogoutRedirectUri": "https://localhost:5001/",
        "RedirectUri": "https://localhost:5001/authentication/login-callback",
        "ResponseType": "code"
      }
    }
    
    推荐文章