Personalizada modelo de licencia Asp.Net Core centros autorizados en IdentityServer4

I. Introducción

Yo compartí un artículo anterior sobre la aplicación Asp.Net Core IdentityServer4 autoridad en lo real me artículo, muchos de los cuales bloggers me dan un problema, que tiene un grupo de Amigos de Bo hizo una escena, le doy respuestas no es perfecto, entonces me entero a través de su propio examen y leer el código fuente correspondiente y se encontró que IdentityServer4se puede implementar un encargo GrantTypede licencia.

Exención de responsabilidad : Al leer esto si usted no leyó mi último autoridad de aplicación Asp.Net Core IdentityServer4 de lo real artículo, por favor lugar para ver que el artículo anterior, este artículo se verá más claro, gracias por el apoyo gracias a la atención!

En segundo lugar, el escenario de simulación

El artículo ha puesto las actualizaciones del sistema suministrador de electricidad a partir de una única arquitectura puerta de entrada a una arquitectura multi-entrada, la arquitectura es el siguiente:

Sin embargo, lo anterior 授权中心uso es 密码授权模式, pero para 微信小程序, 微信公众号商城uso final autorizado no es muy apropiado;
微信小程序y 微信公众号escenario de cliente micro-centro comercial es como sigue:
el acceso de los usuarios applets número centro comercial o micro-canal público Mall después de 微信服务端obtener la autorización para conseguir que el usuario relevante openId, unionId, userNameetc. información relacionada, y luego llevar openId, unionId, userNamey otra información de acceso de 授权中心puerta de enlace, la autorización, si no existe, no los usuarios registrados de forma automática, si hay una autorización de inicio de sesión con éxito y otras operaciones. Después de esta escena que hago para transformar 授权中心servicio de pasarela que? Después de la investigación y la discusión, puse la tabla anterior refinado en un diagrama de arquitectura de pasarela a continuación:

En tercer lugar, la mejora Autoridad

El último artículo de nuestras soluciones se ha establecido en tres proyectos:

  • Jlion.NetCore.Identity.Service: 授权中心Gateway - WebApiProyecto
  • Jlion.NetCore.Identity.UserApiService: 用户业务网关- WebApiProyecto
  • Jlion.NetCore.Identity: 基础类库Principalmente utilizado para la capa de infraestructura pública para poner éste

A través del análisis de escenarios demanda anterior, presentamos 授权中心lo suficientemente esta demanda, por lo que podemos IdentityServer4para satisfacer las necesidades de la escena por encima de la mejora manera de autorización personalizado.

Después de ver el código fuente He descubierto que podemos poner en práctica IExtensionGrantValidatorinterfaz abstracta a una forma de autorización personalizado para alcanzar y poner en práctica ValidateAsyncel método,
y ahora estoy en la solución antes de 授权中心nuevos proyectos en el WeiXinOpenGrantValidatorcódigo de clase es el siguiente:

public class WeiXinOpenGrantValidator : IExtensionGrantValidator
{
  public string GrantType => GrantTypeConstants.ResourceWeixinOpen;

  public async Task ValidateAsync(ExtensionGrantValidationContext context)
  {
      try
      {
         #region 参数获取
         var openId = context.Request.Raw[ParamConstants.OpenId];
         var unionId = context.Request.Raw[ParamConstants.UnionId];
         var userName = context.Request.Raw[ParamConstants.UserName];
         #endregion

         #region 通过openId和unionId 参数来进行数据库的相关验证
         var claimList = await ValidateUserAsync(openId, unionId);
         #endregion

         #region 授权通过
         //授权通过返回
         context.Result = new GrantValidationResult
         (
             subject: openId,
             authenticationMethod: "custom",
             claims: claimList.ToArray()
         );
         #endregion
     }
     catch (Exception ex)
     {
         context.Result = new GrantValidationResult()
         {
             IsError = true,
             Error = ex.Message
         };
     }
  }

   #region Private Method
   /// <summary>
   /// 验证用户
   /// </summary>
   /// <param name="loginName"></param>
   /// <param name="password"></param>
   /// <returns></returns>
   private async Task<List<Claim>> ValidateUserAsync(string openId, string unionId)
   {
      //TODO 这里可以通过openId 和unionId 来查询用户信息(数据库查询),
      //我这里为了方便测试还是直接写测试的openId 相关信息用户
      var user = OAuthMemoryData.GetWeiXinOpenIdTestUsers();

      if (user == null)
      {
         //注册用户
      }

      return new List<Claim>()
      {
          new Claim(ClaimTypes.Name, $"{openId}"),
      };
   }
   #endregion
 }

GrantTypeConstantsEl código es estática, que se utiliza principalmente para definir GrantTypeun tipo de autorización personalizado, y más probabilidades de seguir la costumbre de Autorización Por lo tanto, hay un lugar unificado para administrar, fácil de mantener, de la siguiente manera:

 public static class GrantTypeConstants
 {
     /// <summary>
     /// GrantType - 微信端授权
     /// </summary>
     public const string ResourceWeixinOpen = "weixinopen";
 }

ParamConstants Clase es la definición de los parámetros requeridos código de autorización personalizado es el siguiente:

public class ParamConstants
{
    public const string OpenId = "openid";

    public const string UnionId = "unionid";

    public const string UserName = "user_name";
}

Muy por encima era validador propio se ha logrado, pero no lo suficiente, tenemos que dejar que los clientes soportan el tipo de encargo autorización, abrimos el OAuthMemoryDatacódigo GetClients, el código es el siguiente:

public static IEnumerable<Client> GetClients()
{
    return new List<Client>
    {
        new Client()
        {
            ClientId =OAuthConfig.UserApi.ClientId,
            AllowedGrantTypes = new List<string>()
            {
                GrantTypes.ResourceOwnerPassword.FirstOrDefault(),//Resource Owner Password模式
                GrantTypeConstants.ResourceWeixinOpen,//新增的自定义微信客户端的授权模式
            },
            ClientSecrets = {new Secret(OAuthConfig.UserApi.Secret.Sha256()) },
            AllowedScopes= {OAuthConfig.UserApi.ApiName},
            AccessTokenLifetime = OAuthConfig.ExpireIn,
        },
                
    };
}

Cliente AllowedGrantTypesde configuración de autorización Acabo de añadir una costumbre GrantTypeConstants.ResourceWeixinOpen,
ahora también apoyan el cliente se ha configurado, y, finalmente, tenemos que AddExtensionGrantValidator<>extender el método 自定义授权验证器para registrar DI, el código es el siguiente:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();


    #region 数据库存储方式
    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryApiResources(OAuthMemoryData.GetApiResources())
        //.AddInMemoryClients(OAuthMemoryData.GetClients())
        .AddClientStore<ClientStore>()
        .AddResourceOwnerValidator<ResourceOwnerPasswordValidator>()
        .AddExtensionGrantValidator<WeiXinOpenGrantValidator>();
    #endregion
 }

Bueno, simple 授权中心actualización del código se ha completado, que se ejecutan desde la línea de comandos 授权中心y 用户业务网关, antes 用户业务网关sin cambiar ningún código, el diagrama son los siguientes:

Jlion.NetCore.Identity.Server autoridad para ejecutar el siguiente

Jlion.NetCore.Identity.UserApiServer puerta de enlace de servicio de usuario se ejecuta como sigue

Ahora usamos cartero de simulación openId, unionId, userNamesolicitud de parámetros 授权中心para obtener AccessToken, a raíz de las solicitudes:

Tenemos que llevar la información de autorización se accede a través de las cartero 用户业务网关datos, el resultado es el siguiente:

Bueno, modelo de licencia personalizada se ha completado, simplemente 授权中心tiene la actualización se ha completado, lo anterior WeiXinOpenGrantValidatorvalidador no ir directamente a un enfoque de base de datos para la autenticación y registro, escribir una sencilla demostración, nos interesa que la base de datos rápida TODO operación para lograr, he presentado al código en gitHub, y aquí para compartir mi dirección de blog de demostración de combate sincrónica nuevo https://github.com/a312586670/IdentityServerDemo

En cuarto lugar, el pensamiento y el resumen

Benpian introduje la costumbre de autorización, mirando el código fuente y el acceso a la información adquirida IdentityServer4puede 自定义授权ser de forma prolongada. Esto 授权中心puede extenderse varios conjuntos de métodos de autorización, tales como el intercambio de encargo de la letra micro autorización OpenID hoy, los códigos de verificación de SMS y otra autorización personalizado autorizado, en una Api资源posible fusión de múltiples conjuntos de modelos de licencia, flexibles y escalables, actualización flexible. El conocimiento Benpian involucrado pequeña, pero muy importante, ya que utilizamos 授权中心a menudo encuentro con una variedad de métodos de autenticación y diferentes conjuntos de aplicaciones de usuario utiliza una autenticación de la identidad unificada, la autorización dominar los principios de la lata el cambio de una manera diferente en la capacidad de la autorización, aquí algunos bloggers le pedirá AccentTokenuna fecha de caducidad, expirará cómo hacerlo? ¿Quieres volver a autorizar, por favor? Estas cuestiones que se encargará de la siguiente artículo para compartir.

Alma preguntó:

El anterior 授权中心ejemplo es principalmente para darle una mejor comprensión de autorización personalizado de escenarios de uso y su flexibilidad, la escena real, de manera directa a openIdotra información pertinente para verificar la caja fuerte autorización? Todo el mundo puede estar pensando, ¿y si nos solución insegura bueno? La superación personal es dejar de pensar por sí mismos, que pueden agradar a jugar a su manera de pensar, las respuestas permanecen en el tablero de mensajes, de aprender para su referencia, gracias! ! !

Supongo que te gusta

Origin www.cnblogs.com/jlion/p/12468365.html
Recomendado
Clasificación