public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context) { try { LoginCategory loginCategory = context.Request.Raw.AllKeys.Contains("type") ? (LoginCategory)Enum.Parse(typeof(LoginCategory), context.Request.Raw["type"]) : LoginCategory.Password; LoginUserDTO userFromDb; switch (loginCategory) { case LoginCategory.OpenID: userFromDb = await _userService.LoginByWeChatOpenIDAsync(context.UserName, context.Password); break; default: userFromDb = await _userService.LoginAsync(context.UserName, context.Password); break; } context.Result = userFromDb == null ? new GrantValidationResult(TokenRequestErrors.InvalidGrant, "用户不存在") : new GrantValidationResult(userFromDb.ID.ToString(), "custom"); } catch (InvalidOperationException ex) { context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, ex.Message); } }
/// <summary> /// 构造函数 /// </summary> /// <param name="category">用户类别</param> public LoginInfo(LoginCategory category) { Category = category; }
/// <summary> /// 获取Token返回 /// </summary> /// <param name="account"></param> /// <param name="password"></param> /// <param name="type"></param> /// <returns></returns> public static async Task <TokenResponse> GetTokenResponseAsync(string account, string password, LoginCategory type = LoginCategory.Password) { var discoveryDocumentRequest = new DiscoveryDocumentRequest { Address = ApplicationConfig.IdentityServer.Url, Policy = new DiscoveryPolicy { RequireHttps = false } }; var client = new HttpClient(); DiscoveryResponse discoveryResponse = await client.GetDiscoveryDocumentAsync(discoveryDocumentRequest); if (discoveryResponse.IsError) { throw new InvalidOperationException("连接认证服务器失败"); } TokenResponse tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest { Address = discoveryResponse.TokenEndpoint, ClientId = "Web", ClientSecret = ApplicationConfig.IdentityServer.Secret, UserName = account, Password = password, Scope = ApplicationConfig.IdentityServer.Scope, Parameters = { { "type", type.ToString() } } }); return(tokenResponse); }