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 IdentityServer4
se puede implementar un encargo GrantType
de 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
, userName
etc. información relacionada, y luego llevar openId
, unionId
, userName
y 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 -WebApi
ProyectoJlion.NetCore.Identity.UserApiService
:用户业务网关
-WebApi
ProyectoJlion.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 IdentityServer4
para 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 IExtensionGrantValidator
interfaz abstracta a una forma de autorización personalizado para alcanzar y poner en práctica ValidateAsync
el método,
y ahora estoy en la solución antes de 授权中心
nuevos proyectos en el WeiXinOpenGrantValidator
có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
}
GrantTypeConstants
El código es estática, que se utiliza principalmente para definir GrantType
un 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 OAuthMemoryData
có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 AllowedGrantTypes
de 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
, userName
solicitud 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 WeiXinOpenGrantValidator
validador 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 IdentityServer4
puede 自定义授权
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á AccentToken
una 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 openId
otra 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! ! !