TIP: resetear contraseña con ASP.NET Identity

TIP: resetear contraseña con ASP.NET Identity

En entornos .NET Framework debemos utilizar las implementaciones de OWIN / Katana de manera adicional, en .NET Core (o el nombre que acabe teniendo) no es necesario al tratarse de una evolución de las librerías Microsoft.Owin.*

Un ejemplo sencillo síncrono para realizar un cambio de contraseña:

using Microsoft.Owin.Security.DataProtection;
using Microsoft.Owin.Security;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
...

var userStore = new UserStore<IdentityUser>();
var userManager = new UserManager<IdentityUser>(userStore);
var user = userManager.FindByName(MyUserNameTextBox.Text);

var provider = new DpapiDataProtectionProvider(System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName());
userManager.UserTokenProvider = (IUserTokenProvider<IdentityUser, string>)(new DataProtectorTokenProvider<IdentityUser, string>(provider.Create("UserToken")) as IUserTokenProvider<IdentityUser, string>);

var token = userManager.GeneratePasswordResetToken(user.Id);
var result = userManager.ResetPassword(user.Id, token, MyPasswordTextBox.Text);
EF6 vs. EF Core: modelo de datos

EF6 vs. EF Core: modelo de datos

Cuando hablamos de Entity Famework 6 «clásico» debemos tener en cuenta que su versión 1.0 apareció en 2008 y la última versión corresponde con la 6.4.4 lanzada el 15 de mayo de 2020. Todo los ORM (Object-Relational mapping), como también lo son NHibernate ó Dapper, facilitan una capa intermedia entre las bases de datos relacionales y el modelo de objetos de nuestra aplicación.

Dentro de la hoja de ruta de Microsoft para unificar tecnología .NET tambien afecta a este ORM, la nueva versión EF Core es una versión más ligera, extensible, modular y multiplataforma aunque algunas características previas todavía están pendientes de valorar su integración.

Leer más
TIP: Hashtable to Object

TIP: Hashtable to Object

Si bien existen librerias completas para asignar propiedades entre objetos, también es posible asignar de manera automática nuevos valores en pocas líneas de forma recursiva. En este caso se trata de asignar nuevos valores editados en un objeto que, por ejemplo, podremos utilizar para guardar los cambios dentro de Entity Framework. Un escenario común en un Grid:

using System.Data;
using System.Linq;
using System.Reflection;
...

Hashtable nuevosValores;
...

long idBuscado = long.Parse(nuevosValores["id"].ToString());
Coches n = miEntidad.Coches.Where(x => x.id == idBuscado).FirstOrDefault();

foreach (PropertyInfo p in n.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
    // Puede tener propiedades el objecto de la entidad que no se utilizan
    // por ejemplo la relación con otra tabla tambien aparece listada
    if (nuevosValores.ContainsKey(p.Name))
        p.SetValue(n, nuevosValores[p.Name]);
}

miEntidad.SaveChanges();

Un ejemplo sencillo del uso de la reflexión en los objectos.

PrincipalId webapp Azure

PrincipalId webapp Azure

El acceso a propiedades de objeto Identity desde línea de comandos en PowerShell para Azure debería obtenerse mediante:

Get-AzWebApp -ResourceGroupName "NombreDeRecursos" -Name "NombreAplicacionWeb"
--$appId=(Get-AzWebApp -ResourceGroupName $resourcegroupname -Name $webappname).Identity.PrincipalId
--$appId=(Get-AzureRmWebApp $resourcegroupname -Name $webappname).Identity.PrincipalId

No tenemos acceso a estos identificadores, podemos utilizar en su lugar el acceso mediante Service Managed Identity:

az webapp identity assign -g $resourcegroupname -n $webappname 

Del que obtendremos el identificador necesario:

{- Finished ..
  "principalId": "b1dd98c4-eae0-4fea-8e46-efzs563dc9630",
  "tenantId": "504c8804-c8a6-9090-8fzs-e35841104187",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

Con la administración de identidades administradas habilitadas y permitiendo al acceso a los recursos a la aplicación, ya podemos utilizar tokens de acceso Oauth. De este modo solo se puede acceder a este extremo desde el código que se ejecuta en el servicio de la aplicación, por ejemplo, solo nuestro sitio web puede obtener tokens de acceso.

Descargar archivos grandes desde Azure Storage con Firmas de acceso compartido (SAS) – SDK v12

Descargar archivos grandes desde Azure Storage con Firmas de acceso compartido (SAS) – SDK v12

Si bien el funcionamiento es similar a la v11, se utiliza la librería Azure.Storage.Blobs de código abierto en lugar del paquete WindowsAzure.Storage:

AccountSasBuilder sasBuilder = new AccountSasBuilder()
{
    Services = AccountSasServices.Blobs | AccountSasServices.Files,
    ResourceTypes = AccountSasResourceTypes.All,
    ExpiresOn = DateTimeOffset.UtcNow.AddHours(1),
    Protocol = SasProtocol.Https
};

sasBuilder.SetPermissions(AccountSasPermissions.Read); // | AccountSasPermissions.Write

StorageSharedKeyCredential key = new StorageSharedKeyCredential("MiNombreDeCuenta","MiClaveDeCuenta"));

// Generar a partir de la clave de acceso, el token SAS:
string sasToken = sasBuilder.ToSasQueryParameters(key).ToString();

// Generar la dirección URL completa incluyendo el token SAS:
UriBuilder fullUri = new UriBuilder()
{
    Scheme = "https",
    Host = string.Format("{0}.blob.core.windows.net", CloudConfigurationManager.GetSetting("accountName")),
    Path = string.Format("{0}/{1}", nombreContainer, nombreArchivo),
    Query = sasToken
};
				
Response.Redirect(fullUri.Uri)

De este modo mantenemos de forma más segura el acceso a ficheros dentro de containers con control de tiempo de expiración y permisos de usuario.