示例#1
0
        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);
        }