//Sobreponho a classe responsavel por chamar a autorização de um request / HttpActionContext Contem informações da ação de requisição public override void OnAuthorization(HttpActionContext actionContext) { HttpRequestMessage request = new HttpRequestMessage(); try { //Representa informações de autenticação em Authorization, ProxyAuthorization, WWW-Authneticate, e valores de cabeçalho Proxy-Authenticate. AuthenticationHeaderValue authValue = actionContext.Request.Headers.Authorization; //Objeto de configuração que associa ao request request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()); //Se não houver valor para authValue ele abre uma caixa de login if (authValue != null && !String.IsNullOrWhiteSpace(authValue.Parameter) && authValue.Scheme == BasicAuthResponseHeaderValue) { //Contem as informações de usuario e senha. Ver método ParseAuthorizationHeader Credentials parsedCredentials = ParseAuthorizationHeader(authValue.Parameter); if (parsedCredentials != null) { //Identidade do usuário logado CurrentUser = new CustomPrincipal(parsedCredentials.CPF, null); CustomRoleProvider CurrentRole = new CustomRoleProvider(); //Aqui pode ser feita as consistências para validação do usuário //if (!user.Contains(parsedCredentials.CPF)) if (!CurrentUser.GetUsers().Contains(parsedCredentials.CPF)) { actionContext.Response = request.CreateResponse(HttpStatusCode.Unauthorized, "Serviço não permitido"); actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); return; } if (!CurrentUser.GetUsers(parsedCredentials.CPF, parsedCredentials.Senha)) { actionContext.Response = request.CreateResponse(HttpStatusCode.Unauthorized, "Senha Incorreta"); actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); return; } if (!CurrentRole.IsUserInRole(parsedCredentials.CPF, Roles)) { actionContext.Response = request.CreateResponse(HttpStatusCode.MethodNotAllowed, "Não tem permissão"); actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); return; } //Se passar pelas validações ele simplesmente da um return, caso contrário a aplicação para. // actionContext.Response = request.CreateResponse(HttpStatusCode.Continue); // actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); return; } else { actionContext.Response = request.CreateResponse(HttpStatusCode.Unauthorized, "Necessário efetuar login"); actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); return; } } else { actionContext.Response = request.CreateResponse(HttpStatusCode.Unauthorized, "Usuário não encontrado"); actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); return; } } catch (Exception) { actionContext.Response = request.CreateResponse(HttpStatusCode.InternalServerError); actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); return; } }