Q:

Validar número Cartão de crédito

Como faço para validar números de cartões de crédito?
Não farei integração com operadora de cartão, preciso apenas validar o número, assim como ocorre com a validação com CPF. 

A:

Você pode utilizar o atributo CreditCardAttribute para validar. Como está utilizando asp.net-mvc-5 creio que já está familiarizado com o Data Annotations. Ele possui um atributo chamado [CreditCard], que você pode utilizar para esse fim. Para utilizar o mesmo basta fazer a marcação em sua propriedade da seguinte forma:
[CreditCard(ErrorMessage = "Cartão de crédito inválido")]
public string CartaoCredito { get; set; }

Nesta resposta você conseguirá ver mais detalhado.
Você pode implementar seus próprios atributos ou métodos para validar, caso deseje.
Alguns links para ajudar:
Credit Card Validation Client Asp.Net.
Credit Card Attribute.

A:

A validação de números de cartão de crédito normalmente é feita pelo algoritmo de Luhn:

Retire o último dígito do número. Ele é o verificador;
Escreva os números na ordem inversa;
Multiplique os dígitos das casas ímpares por 2 e subtraia 9 de todos os resultados maiores que 9;
Some todos os números;
O dígito verificador (aquele do passo 1) é o número que você precisa somar a todos os outros números somados pra obter um módulo 10.

Exemplo
Passo                                                                                                       Total
Número Original                          :  4   5   5   6   7   3   7   5   8   6   8   9   9   8   5   5   
Tirando o último dígito                  :  4   5   5   6   7   3   7   5   8   6   8   9   9   8   5       
Invertendo                               :  5   8   9   9   8   6   8   5   7   3   7   6   5   5   4       
Multiplicando casas ímpares por 2        :  10  8   18  9   16  6   16  5   14  3   14  6   10  5   8       
Subtraia 9 de todos os números acima de 9:  1   8   9   9   7   6   7   5   5   3   5   6   1   5   8       
Somando todos os números                 :  1   8   9   9   7   6   7   5   5   3   5   6   1   5   8       85
Mod 10: 85, módulo 10 = 5 (último dígito do cartão)

Formatos de Operadoras Conhecidas
Bandeira                    Intervalo de Início             Número de Dígitos
-----------------------------------------------------------------------------
American Express            34, 37                          15
Diners Club - Carte Blanche 300, 301, 302, 303, 304, 305    14
Diners Club - International 36                              14
Diners Club - USA & Canada  54                              16
Discover                    6011, 622126 até 622925, 644,   16
                            645, 646, 647, 648, 649, 65     
InstaPayment                637, 638, 639                   16
JCB                         3528 até 3589                   16
Laser                       6304, 6706, 6771, 6709          16-19
Maestro                     5018, 5020, 5038, 5893, 6304,   16-19
                            6759, 6761, 6762, 6763          
MasterCard                  51, 52, 53, 54, 55              16-19
Visa                        4                               13-16
Visa Electron               4026, 417500, 4508, 4844, 4913, 16
                            4917    

Tirei daqui.
No ASP.NET MVC
Por atributo, conforme a resposta do @Randrade. 

A:

O Algoritmo utilizado para calcular o digito de verificação (Check Digit) de Números de Cartão de Crédito é o Algoritmo de Luhn, porém não basta apenas validar a informação sem levar em conta as características de um número de Cartão de Crédito que são:

Possuir somente números
Ter entre 12 e 19 dígitos (na verdade não há CC com 17 dígitos)
Os 6 primeiros dígitos devem indicar um IIN (Issuer identification number) válido. Ele é chamado de BIN no meio bancário.
Passar na validação do Algoritmo de Luhnn

A verificação do item BIN necessita de uma base de informações para comparação. Não existe uma lógica na geração dos BINs. Você pode ter faixas por exemplo que tem saltos e dentro destes saltos o BIN pertecer a uma instituição diferente, inclusive de país diferente.
É um clássico erro acreditar que todo cartão que comece com 4 é VISA e com 5 seja Mastercard, por exemplo. Atualmente no Brasil isso é até válido, pois temos poucas empresas de Cartão o que acaba reservando o 4 e o 5 apenas para estas duas Bandeiras.
Deixando estes aspectos de lado, pois não há como validar um BIN via código sem que seja feita algum tipo de consulta, a validação pode ser feita com o seguinte algoritmo

Verificar se o tamanho do numero do cartão está entre 12 e 19. Atualmente no Brasil é raro ter um cartão diferente de 16. Alguns Hipercard tinham 19 mas já estão saindo com 16 também.
Verificar se o valor possui somente números
Verificar se o número passa pela validação do Algoritmo de Luhnn

Abaixo um código em C#. Ele é apenas uma forma de entender pois já há nas versões atuais do ASP.net, validação por Attributes para esta verificação, conforme resposta do @Randrade
O Algoritmo de Luhnn está representado na resposta do @Cigano Morrison Mendez com a ressalva que na última linha, onde está 
Mod 10: 85, módulo 10 = 5 (último dígito do cartão)

Deveria estar
Mod 10: 85, módulo 10 = 5, Check Digit = 10 - 5 = 5 (último dígito da sequencia)

Na verdade, não há a necessidade de calcular o check digit. Basta incluir o termo na soma e calcular o módulo 10 dela. Se for zero é válido.
    // About the Algorithm
    /**
        @See https://en.wikipedia.org/wiki/Luhn_algorithm
        Steps:
        1 - From the rightmost Digit of a Numeric String, Double the value of every digit on odd positions
        2 - If the obtained value is greather than 9, subtract 9 from it
        3 - Sum all values
        4 - Calculate the Modulus of the value on 10 basis, if is zero so the String has a Luhnn Check Valid
    **/

    public static bool IsValidLuhnn(string val) {

        int currentDigit;
        int valSum = 0;
        int currentProcNum = 0; 

        for (int i = val.Length-1; i >= 0; i--) {           
            //parse to int the current rightmost digit, if fail return false (not-valid id)
            if(!int.TryParse(val.Substring(i,1), out currentDigit))
                return false ;              

            currentProcNum = currentDigit << (1 +i & 1);                                                                    
            //summarize the processed digits
            valSum +=  (currentProcNum > 9 ? currentProcNum - 9 : currentProcNum);

        }  

        // if digits sum is exactly divisible by 10, return true (valid), else false (not-valid)
        // valSum must be greater than zero to avoid validate 0000000...00 value
        return (valSum > 0 && valSum % 10 == 0) ;
    } 

    public static bool isValidCreditCardNumber(string cc) {
        // rule #1, must be only numbers
        if (cc.All(Char.IsDigit) == false) {
            return false;
        }
        // rule #2, must have at least 12 and max of 19 digits
        if (12 > cc.Length || cc.Length > 19) {
            return false;
        }
        // rule #3, must pass Luhnn Algorithm
        return IsValidLuhnn(cc);

    }

Pode ser testado aqui

