none
Habilitar CORS en ApiRest C# RRS feed

  • Pregunta

  • Buenas noches, estoy desarrollando una aplicación en Ionic, dicha aplicación se conecta a un ApiRest en C#, pero este último me está dando problemas de CORS y no logro solucionarlo.

    El token validation handler es el siguiente:

    using Microsoft.IdentityModel.Tokens;
    using System;
    using System.Collections.Generic;
    using System.IdentityModel.Tokens.Jwt;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Web;
    namespace WsAppHibryd
    {
        public class TokenValidationHandler : DelegatingHandler
        {
            private static bool TryRetrieveToken(HttpRequestMessage request, out string token)
            {
                token = null;
                IEnumerable<string> authzHeaders;
                if (!request.Headers.TryGetValues("Authorization", out authzHeaders) || authzHeaders.Count() > 1)
                {
                    return false;
                }
                var bearerToken = authzHeaders.ElementAt(0);
                token = bearerToken.StartsWith("Bearer") ? bearerToken.Substring(7) : bearerToken;
                return true;
            }

            protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                HttpStatusCode statusCode;
                string token;
                //determine whether a jwt exists or not
                if (!TryRetrieveToken(request, out token))
                {
                    statusCode = HttpStatusCode.Unauthorized;
                    //allow requests with no token - whether a action method needs an authentication can be set with the claimsauthorization attribute
                    return base.SendAsync(request, cancellationToken); //Aqui es donde me rechaza el servicio
                }

                try
                {
                    const string sec = "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429090fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1";
                    var now = DateTime.UtcNow;
                    var securityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(sec));


                    SecurityToken securityToken;
                    JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
                    TokenValidationParameters validationParameters = new TokenValidationParameters()
                    {
                        ValidAudience = "http://localhost:4986",
                        ValidIssuer = "http://localhost:4986",
                        ValidateLifetime = true,
                        ValidateIssuerSigningKey = true,
                        LifetimeValidator = this.LifetimeValidator,
                        IssuerSigningKey = securityKey,
                        ValidateAudience = false,
                        ValidateIssuer = false

                    };
                    //extract and assign the user of the jwt
                    Thread.CurrentPrincipal = handler.ValidateToken(token, validationParameters, out securityToken);
                    HttpContext.Current.User = handler.ValidateToken(token, validationParameters, out securityToken);

                    return base.SendAsync(request, cancellationToken);
                }
                catch (SecurityTokenValidationException e)
                {
                    statusCode = HttpStatusCode.Unauthorized;
                }
                catch (Exception ex)
                {
                    statusCode = HttpStatusCode.InternalServerError;
                }
                return Task<HttpResponseMessage>.Factory.StartNew(() => new HttpResponseMessage(statusCode) { });
            }

            public bool LifetimeValidator(DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
            {
                if (expires != null)
                {
                    if (DateTime.UtcNow < expires) return true;
                }
                return false;
            }
        }
    }

    Y este es el login controller:

    using WsAppHibryd.Context.Configuration;
    using WsAppHibryd.Context.Ti;
    using WsAppHibryd.Models;
    using Microsoft.IdentityModel.Tokens;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using System;
    using System.Collections.Generic;
    using System.IdentityModel.Tokens.Jwt;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Security.Claims;
    using System.Web.Http;

    namespace WsAppHibryd.Controllers
    {
        public class LoginController : ApiController
        {
            internal Token Token { get; private set; }

            [HttpPost]
            public IHttpActionResult Authenticate([FromBody] Login login)
            {
                var loginResponse = new LoginResponse { };
                Login loginrequest = new Login { };
                if (login != null)
                {
                    if (login.Codigo == null)
                        return NotFound();

                    if (login.Usuario == null)
                        return NotFound();

                    if (login.Password == null)
                        return NotFound();

                    loginrequest.Codigo = login.Codigo.ToString();
                    loginrequest.Usuario = login.Usuario.ToString();
                    loginrequest.Password = Utils.CreateMD5(Utils.CreateMD5(login.Password));
                    DbTi db = new DbTi();
                    Utils.StatusResult status = db.Login(ref loginrequest);
                    if (status != Utils.StatusResult.OK)
                    {
                        return BadRequest(status.ToString());
                    }
                    else
                    {
                        string token = createToken(loginrequest);
                        //return the token
                        Token = new Token { token = token };
                        return Ok(JsonConvert.SerializeObject(Token));
                    }
                }
                else
                {
                    return NotFound();
                }
            }

            private string createToken(Login login)
            {
                DateTime issuedAt = DateTime.UtcNow;
                DateTime expires = DateTime.UtcNow.AddMinutes(30);

                //http://stackoverflow.com/questions/18223868/how-to-encrypt-jwt-security-token
                var tokenHandler = new JwtSecurityTokenHandler();

                //create a identity and add claims to the user which we want to log in
                ClaimsIdentity claimsIdentity = new ClaimsIdentity(new[]
                {
                    new Claim("Codigo", login.Codigo),
                    new Claim("Usuario", login.Usuario),
                    new Claim("Password", login.Password),
                    new Claim("Nombres", login.Nombres),
                    new Claim("Apellidos", login.Apellidos),
                    new Claim("NombreCompleto", login.NombreCompleto),
                    new Claim("Token", login.Token),
                    new Claim("status", login.status.ToString())
                });

                const string sec = "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429090fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1";
                var now = DateTime.UtcNow;
                var securityKey = new SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(sec));
                var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);


                //create the jwt
                var token = tokenHandler.CreateJwtSecurityToken(issuer: "http://localhost:4986/",
                                                                audience: "http://localhost:4986/",
                                                                subject: claimsIdentity,
                                                                notBefore: issuedAt,
                                                                expires: expires,
                                                                signingCredentials: signingCredentials);

                var tokenString = tokenHandler.WriteToken(token);
                return tokenString;
            }

        }

        internal class Token
        {
            public Token()
            {

            }

            public string token { get; set; }
        }

    Por si sirve de algo, este es el proyecto almacenado en Drive.

    https://drive.google.com/open?id=1GkTijGpN2TyWUY6jQ3PXTf9kOean4pNB

    Los parametros que se envían son:

    {"codigo":"1234","usuario":"54032","password":"12345678"}

    Si alguien puede ayudarme a habilitar CORS, muchas gracias por su ayuda. 


    • Editado Estuardo L sábado, 27 de octubre de 2018 6:17
    sábado, 27 de octubre de 2018 6:10

Todas las respuestas