HttpSelfHostServer с UserNamePasswordValidator
Я настраиваю WebApi, используя HttpSelfHostServer с базовой безопасностью, используя UserNamePasswordValidator с пользовательской проверкой пользователя.
Все приложение работает нормально, каждый раз, когда я делаю запрос, Api запрашивает учетные данные и проверяет их.
Единственная проблема, которая у меня есть, заключается в том, что в случае сбоя проверки пользователя метод Validate выдает и исключение, но это исключение "исчезает в воздухе". Я имею в виду, что браузер не отображает сообщение об исключении, как в исключениях контроллера, и сообщение об исключении Оно не зарегистрировано приложением, точно так же, как исключение не существует вообще.
Это мой код:
Service.cs
public partial class AperturaDatosSvc2:ServiceBase
{
public AxoftAperturaDatosSvc2()
{
InitializeComponent();
}
HttpSelfHostServer server = null;
const string port =8000;
protected override void OnStop()
{
try
{
if (hosts != null)
foreach (HttpSelfHostServer h in hosts)
h.CloseAsync();
}
catch (Exception ex)
{
LOGs.Write(LOGs.eLogType.ERROR, "OnStop", ex.Message);
}
}
protected override void OnStart(string[] args)
{
HttpSelfHostConfiguration config = null;
server = null;
Uri httpUrl = new Uri(string.Format("http://localhost:{0}/", port));
//Create ServiceHost
config = new HttpSelfHostConfiguration(httpUrl);
config.Routes.MapHttpRoute("AperturaController", "{Controller}/" + Utils.GetSafeHLNumber(hlnumber).Replace("_", "-") + "/{empresa}/{obj}/{parametros}/{campos}", defaults: new { Controller = "AperturaController", empresa = RouteParameter.Optional, obj = RouteParameter.Optional, parametros = RouteParameter.Optional, campos = RouteParameter.Optional });
config.ClientCredentialType = HttpClientCredentialType.Basic;
config.UserNamePasswordValidator = new ValidadorUsuario(this.config.Find(x => x.HLNUMBER == hlnumber), llaves.Find(x => x.llave == hlnumber));
config.ClientCredentialType = HttpClientCredentialType.Basic;
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
server = new HttpSelfHostServer(config);
var task = h.OpenAsync();
task.Wait();
}
}
UserValidate.cs
public class ValidateUser : UserNamePasswordValidator
{
DBManager _dbm;
DBManager dbm
{
get
{
_dbm = new DBManager(Connection);
return _dbm;
}
}
public override void Validate(string userName, string password)
{
string pwdEnc = string.Empty;
try
{
if (cfg != null)
{
DICCIO_USER usuario = dbm.getUsuario(userName);
if ((usuario == null))
{
AddressAccessDeniedException exep = new AddressAccessDeniedException("Nombre de usuario o contraseña no válidos.");
exep.Data["HttpStatusCode"] = HttpStatusCode.Unauthorized;
throw exep;
}
else if (!ValidateUser(cfg, userName, password))
{
AddressAccessDeniedException exep = new AddressAccessDeniedException("Ocurrio un error al intentar acceder al sistema" + cfg.HLNUMBER + ".");
exep.Data["HttpStatusCode"] = HttpStatusCode.Unauthorized;
throw new MessageSecurityException("Nombre de usuario o contraseña incorrectos.", new FaultException("Nombre de usuario o contraseña incorrectos."));
}
else
{
var currentPrincipal = new GenericPrincipal(new GenericIdentity(userName), null);
Thread.CurrentPrincipal = currentPrincipal;
Console.WriteLine(DateTime.Now.ToString() + " Validation success for user : " + userName);
DesLogueoTango(cfg.HLNUMBER);
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}