sexta-feira, 14 de abril de 2023

IdentityUser - Exemplo Prático

 É uma biblioteca de gerenciamento de usuários da Microsoft para ASP.NET. Ela é chamada de Identidade (Identity) ASP.NET. Ela contém recursos, incluindo hash de senha, validação de senha, armazenamento de usuários e gerenciamento de reivindicações. Ela normalmente inclui alguns recursos básicos de autenticação, como cookies e autenticação multifator. Ela pode até mesmo introduzir sua própria interface de usuário em alguns casos.

Todas as estruturas, incluindo MVC ASP.NET, Web Forms e Web Pages, podem usar o ASP.NET Identity. As informações do usuário são armazenadas em um banco de dados por padrão no ASP.NET Identity. Também é viável armazenar dados em uma variedade de provedores de armazenamento, dependendo das necessidades do aplicativo. SharePoint, serviços de tabela do Azure e outras fontes de dados (exemplos de provedores de dados).

No ASP.NET Identity, a autorização baseada em função também é muito significativa. Agora podemos definir facilmente funções como "Administrador", "Cliente" e assim por diante, o que nos permite atribuir usuários a essas funções e restringir seu acesso a algumas áreas do programa.

O Identificador de ASP.NET é um divisor de águas, pois introduz a Autenticação de Dois Fatores em seu aplicativo Web.

Porém, ela possui um conjunto muito limitado de propriedades, mas é possivel extender. É isso que você irá aprender agora.

 

public class IdentityUser<TKeywhere TKey : IEquatable<TKey>

{

    public IdentityUser() { }

    public IdentityUser(string userName) : this()

    {

        UserName = userName;

    }

    [PersonalData]

    public virtual TKey Id { getset; }

    [ProtectedPersonalData]

    public virtual string UserName { getset; }

    public virtual string NormalizedUserName { getset; }

    [ProtectedPersonalData]

    public virtual string Email { getset; }

    public virtual string NormalizedEmail { getset; }

    [PersonalData]

    public virtual bool EmailConfirmed { getset; }

    public virtual string PasswordHash { getset; }

    public virtual string SecurityStamp { getset; }

    public virtual string ConcurrencyStamp { getset; } = Guid.NewGuid().ToString();

    [ProtectedPersonalData]

    public virtual string PhoneNumber { getset; }

    [PersonalData]

    public virtual bool PhoneNumberConfirmed { getset; }

    [PersonalData]

    public virtual bool TwoFactorEnabled { getset; }

    public virtual DateTimeOffset? LockoutEnd { getset; }

    public virtual bool LockoutEnabled { getset; }

    public virtual int AccessFailedCount { getset; }

    public override string ToString()

        => UserName;

}

  

Estender IdentityUser Class

Você pode nomear a classe que estende a classe IdentityUser como quiser, mas é costume nomeá-la como ApplicationUser. No exemplo abaixo, a classe ApplicationUser  estende a classe IdentityUser .

 public class ApplicationUser : IdentityUser

{

    public string City { getset; }

}

Para encontre todas as referências da classe IdentityUser e substitui-la por nossa classe personalizada ApplicationUser , clique com o botão direito do mouse na classe IdentityUser e, em seguida, selecionar "Localizar todas as referências" no menu de contexto. Navegue até cada referência na lista e substitua a classe IdentityUser pela classe ApplicationUser.

 



Especifique a classe ApplicationUser como o argumento genérico para a classe IdentityDbContext. É assim que a classe IdentityDbContext sabe que precisa trabalhar com nossa classe de usuário personalizada (neste caso, a classe ApplicationUser) em vez da classeIdentityUser interna padrão.

public class AppDbContext : IdentityDbContext<ApplicationUser>

{

    public AppDbContext(DbContextOptions<AppDbContext> options)

        : base(options)

    { }

 

    public DbSet<Employee> Employees { getset; }

 

    protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

        base.OnModelCreating(modelBuilder);

        modelBuilder.Seed();

    }

}

  

Gerar uma nova migração para adicionar colunas à tabela AspNetUsers

Add-Migration Extend_IdentityUser, este comando gera o código de migração necessário para adicionar a coluna Cidade à tabela AspNetUsers.

 

Extend_IdentityUser de classe parcial pública : Migração

{

protected override void Up(MigrationBuilder migrationBuilder)

    {

migrationBuilder.AddColumn<string>(

nome: "Cidade",

tabela: "AspNetUsers",

anulável: verdadeiro);

    }

 

protected override void Down(MigrationBuilder migrationBuilder)

    {

migrationBuilder.DropColumn(

nome: "Cidade",

tabela: "AspNetUsers");

    }

}

 

Em seguida, aplique a migração ao banco de dados usando o seguinte comando: Update-Database

 

 

Estendendo IdentityUser - Add-Migration Não está funcionando

Se a classe ApplicationUser (a classe que estende a classe IdentityUser) não for especificada como o argumento genérico para a classe IdentityDbContext, o comando Add-Migration não funcionará. Ele não gera o código de migração necessário para adicionar as colunas adicionais à tabela de identidade AspNetUsers.Para corrigir isso, especifique a classe ApplicationUser como o argumento genérico para a classe IdentityDbContext.

 

public class AppDbContext : IdentityDbContext<ApplicationUser>

{

    public AppDbContext(DbContextOptions<AppDbContext> options)

        : base(options)

    { }

 

    public DbSet<Employee> Employees { getset; }

 

    protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

        base.OnModelCreating(modelBuilder);

        modelBuilder.Seed();

    }

}

 

Se você obtiver a seguinte exceção, a causa mais provável é em algum lugar com em seu aplicativo você ainda está usando classe IdentityUser em vez da classe ApplicationUser.

 

No service for type 'Microsoft.AspNetCore.Identity.SignInManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered.

 

No Visual Studio, procure a classe IdentityUser em todo o aplicativo usando CTRL + SHIFT + F

 


 

Substitua a classe IdentityUser pela classe ApplicationUser e execute novamente o projeto.

 

Para poder armazenar dados para a coluna Cidade personalizada na tabela AspNetUsers precisamos alterar

· RegisterViewModel classe

· Registrar Visualização

· Registrar ação no AccountController

 

Classe RegisterViewModel Esta é a classe de modelo para o modo de exibição Register. Modifique-o para incluir a propriedade City.

 

public class RegisterViewModel{

    // Other Properties

    public string City { getset; }

}

 

Register View

inclua um campo para capturar um valor para a Cidade.

 

@model RegisterViewModel

 

@{

    ViewBag.Title = "User Registration";

}

 <h1>User Registration</h1>

 

<div class="row">

    <div class="col-md-12">

        <form method="post">

            <div asp-validation-summary="All" class="text-danger"></div>

            <div class="form-group">

                <label asp-for="Email"></label>

                <input asp-for="Email" class="form-control" />

                <span asp-validation-for="Email" class="text-danger"></span>

            </div>

 

            @*Other Fields*@

 

            <div class="form-group">

                <label asp-for="City"></label>

                <input asp-for="City" class="form-control" />

            </div>

 

            <button type="submit" class="btn btn-primary">Register</button>

        </form>

    </div>

</div>

 

AccountController - Ação de registro

· Preencha a propriedade City da instância ApplicationUser que é passada para o método CreateAsync() da classe UserManager.

· Os dados na instância ApplicationUser são salvos na tabela AspNetUsers pela classe IdentityDbContext.

 

[HttpPost]

[AllowAnonymous]

public async Task<IActionResult> Register(RegisterViewModel model)

{

    if (ModelState.IsValid)

    {

        var user = new ApplicationUser

        {

            UserName = model.Email,

            Email = model.Email,

            City = model.City

        };

 

        var result = await userManager.CreateAsync(user, model.Password);

 

        if (result.Succeeded)

        {

            await signInManager.SignInAsync(user, isPersistent: false);

            return RedirectToAction("index""home");

        }

 

        foreach (var error in result.Errors)

        {

            ModelState.AddModelError(string.Empty, error.Description);

        }

    }

 

    return View(model);

}

segunda-feira, 13 de março de 2023

Visual Studio 2020 - Onde Está WEB FORMS?

Se você instalou o Visual Studio Communit 2022, deve estar se perguntando: Onde está o projeto Aplicativo Web ASP.NET.

Se você gosta de criar aplicativos utilizando Web Forms, não se preocupe. É bem fácil adicionar este recurso no Visual Studio 2022. Siga os passos a seguir:


1. Na Janela Criar um Novo Projeto,  clique no link Instalar mais ferramentas e funcionalidades




2. Na janela seguinte, Modificando  - Visual Studio 2022. Clique sobre a guia Componentes Individuais



3. Marque a opção Modelo de projeto e item do .NET Framework



Após isso, você poderá criar seus projetos utilizando o Visual Studio 2022

Até a próxima.


        

 

  

quinta-feira, 9 de fevereiro de 2023

SQL - Retornar Valores de Datas em Anos

DATEDIFF

Retorna a diferença entre valores de data, em anos. O retorno é do tipo int.


SintaxeDATEDIFF ( datepart , startdate , enddate )


Nota:  Unidades datepart comumente usadas incluem monthousecond.O valor datepart não pode ser especificado em uma variável, nem como uma string entre aspas como 'month'.


A tabela a seguir lista todos os valores datepart válidos. DATEDIFF aceita o nome completo do datepart ou qualquer abreviação listada do nome completo.

nome da dataabreviação de data e parte
anoy, yy, yyyy
trimestreqq, qq
mêsmm, m
dia do anovocê
diadd, d
semanawk, ww
horahh
minutomi, n
segundoss, s
milissegundoEM
microssegundomcs
nanossegundons

A diferença int entre startdate e enddate , expressa no limite definido por datepart.

limites do datepart

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(microsecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');



FLOOR

Retorna o maior inteiro menor ou igual à expressão numérica especificada.



SintaxeFLOOR ( numeric_expression )


Argumentosnumeric_expression, é uma expression da categoria de tipo de dados numéricos exatos ou aproximados, com exceção do tipo de dados bit.


Tipo de retorno, retorna o mesmo tipo que numeric_expression.



Exemplos


-- O resultado é a parte inteira do valor calculado no mesmo tipo de dados que numeric_expression.

SELECT FLOOR(123.45), FLOOR(-123.45), FLOOR($123.45);


-- Exibe ano e Mês

  SELECT DATEDIFF(DAY,'1980-10-01', GETDATE()) / 365.25


  -- Exibe apenas anos

  SELECT FLOOR(DATEDIFF(DAY,'1980-10-01', GETDATE()) / 365.25)


  -- Exibe a data atual

  SELECT GETDATE()


  -- Soma dez dias a data atual

  SELECT GETDATE() + 10

terça-feira, 7 de fevereiro de 2023

Criptomoedas e Blockchain

 CRIPTOMOEDAS

 

Criptoativos representam todas as transações realizadas com valores criados digitalmente e independentes de instituições financeiras, como as criptomoedas. Exemplos de moedas.

Bitcoin, Ether, Polygon e Chainlink.

A moeda foi criada em 2008 por Satoshi Nakamoto. Registrada com o domínio bitcoin.org, ela entrou em circulação em 2009. Inicialmente, não teve tanto protagonismo no mercado regular, mas isso não demorou para mudar.

 

O que são criptomoedas?

Banco XP: Criptomoedas são moedas digitais que utilizam a tecnologia blockchain. A Criptografia da blockchain permitiu o surgimento não só de Criptomoedas, mas de Utility Tokens, Secutity Tokens e NFTs.

Banco Modal: Criptomoedas são criptoativos utilizados para pagamentos e demais transações financeiras realizadas, exclusivamente, de forma virtual, que podem ser utilizadas em qualquer parte do mundo. Em resumo: elas não “existem” fisicamente.

Por não deixar nenhum tipo de “rastro”, já que são criadas e monitoradas por inúmeras pessoas, utilizando blockchain, as criptomoedas têm sido a principal forma de pagamento de hackers ao invadirem sistemas corporativos de empresas privadas ou públicas.

Portanto, uma das principais diferenças entre esse tipo de moeda e as fiduciárias (como o dólar, o real etc.) é que elas são totalmente digitais. Dessa forma, todas as transações que as envolvem precisam ser realizadas pela Internet. Por ser uma moeda virtual e, dessa forma, não existir fisicamente, as criptomoedas são utilizadas somente para pagamentos e demais transações financeiras realizadas, exclusivamente, em ambiente virtual, em qualquer parte do mundo.