Identityserver4, проблема с запуском и реализацией - PullRequest
0 голосов
/ 30 августа 2018

Я хочу создать централизованный проект API ядра asp.net с ядром Entity-FrameWork для управления членством, таким как вход в систему, регистрация и т. Д. Отдельно я хочу создать еще один базовый проект asp.net и использовать централизованный проект для членства, например google.com. После долгих поисков я понял, что должен использовать IdentityServer4. Я прочитал этот документ и получил образец от Github, но это было не ясно, и я был смущен. Кто может объяснить четко и шаг за шагом? спасибо

1 Ответ

0 голосов
/ 30 августа 2018

IdentityServer4 имеет простое MeadleWare для использования в Asp.Net Core

public void ConfigureServices(IServiceCollection services){
   ...
   var cert = new X509Certificate2("/Cert/cert.pfx", "123456");

   services.AddIdentityServer()
                .AddInMemoryApiResources(Config.GetApisResources())
                .AddSigningCredential(cert)
                .AddInMemoryClients(Config.GetClients())
                .Services.AddTransient<IResourceOwnerPasswordValidator, ResourceOwnerPasswordValidator>();
   ...
}

public void Configure(ILoggerFactory loggerFactory, IApplicationBuilder app, IHostingEnvironment env){
   ...
   app.UseIdentityServer();
   ...
}

и создайте файл конфигурации:

public class Config
    {
        public static IEnumerable<ApiResource> GetApisResources()
        {
            return new[]
            {
                // simple API with a single scope (in this case the scope name is the same as the api name)
                new ApiResource("api1"),
            };
        }


        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>
        {
            new Client
            {
                ClientId = "spa",
                AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                //IdentityTokenLifetime=10,

                AllowOfflineAccess=true,
                RefreshTokenExpiration = TokenExpiration.Absolute,
                AbsoluteRefreshTokenLifetime = 999999,
                RefreshTokenUsage=TokenUsage.ReUse,
                AccessTokenType=AccessTokenType.Jwt,

                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                },

                AllowedScopes =
                {
                    "api1",
                    IdentityServerConstants.StandardScopes.OfflineAccess
                },
                AccessTokenLifetime=36000
            }
        };
        }
    }

затем в resourceServer используйте сильфон MW:

public void ConfigureServices(IServiceCollection services){
   ...
   services.AddAuthentication(o =>
            {
                o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(o =>
            {
                o.Authority = "http://localhost:5000";
                o.Audience = "self";
                o.RequireHttpsMetadata = false;
                o.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = false,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidateLifetime = true,
                    RequireExpirationTime = true,
                    ClockSkew = TimeSpan.Zero
                };

                o.Events = new JwtBearerEvents()
                {
                    OnAuthenticationFailed = c =>
                    {
                        c.NoResult();
                        c.Response.StatusCode = 401;
                        c.Response.ContentType = "text/plain";
                        return c.Response.WriteAsync(c.Exception.ToString());
                    },
                    OnTokenValidated = context =>
                    {
                        return Task.CompletedTask;
                    },
                    OnMessageReceived = context =>
                    {
                        return Task.CompletedTask;
                    },
                    OnChallenge = context =>
                    {
                        return Task.CompletedTask;
                    }
                };
            });
   ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
   {
      ...
      app.UseAuthentication();
      ...
   }
...