asp.net mvc 2 - route - ¿Cómo implemento la identidad y el principal personalizados en ASP.NET MVC?
select asp-for (2)
Esta pregunta se ha formulado y se ha respondido antes: ASP.NET MVC - Establecer identidad personalizada o IPrincipal
Pero para resumir ...
Cree una clase principal personalizada con las propiedades adicionales que desea almacenar:
Public Class CustomPrincipal
Inherits System.Security.Principal.GenericPrincipal
Private _eyeColor As String
Public ReadOnly Property EyeColor As String
Get
Return _eyeColor
End Get
End Property
Public Sub New(id As System.Security.Principal.IIdentity, roles As String(), eyeColor As String)
MyBase.New(id, roles)
_eyeColor = eyeColor
End Sub
End Class
Modifique global.asax Global.Application_AuthenticateRequest para usar su principal personalizado:
Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)
...
Dim roles() As String = {"examplerole"}
Context.User = new CustomPrincipal(Context.User.Identity, roles, "green")
End Sub
Luego, en otra parte de su código, cuando quiera referirse a una de estas propiedades, haga esto:
CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor
Quiero almacenar información adicional en el usuario autenticado para que pueda tenerla fácilmente accesible (como User.Identity.Id, por ejemplo), en lugar de solo el nombre, ya que planeo no tener ese nombre único.
Hasta ahora me he dado cuenta de que debería buscar implementar un Principal y / o Identidad personalizados, pero no estoy seguro de cómo hacerlo. He estado buscando documentación y tutoriales sobre el tema, pero he encontrado cosas relacionadas en diferentes lugares y lo he encontrado un poco confuso.
He visto cómo agregar información personalizada a la cookie de autenticación en la propiedad de datos del usuario, pero me gustaría tener el beneficio de la inyección de dependencia para pruebas de unidad, que puedo tener con el principal y la identidad.
¿Cuáles son los pasos exactos que debo tener en cuenta si deseo implementar mi propio Director o Identidad?
¿Qué sería lo más simple que podría hacer en este escenario (solo agregue la ID y mantenga todos los valores predeterminados en su lugar)? "Valores predeterminados" incluiría los proveedores predeterminados (membresía, roles, etc.).
He visto la otra pregunta , pero agradecería las respuestas que no dejen ningún agujero en el medio, como las cadenas mágicas de roles en el evento AuthenticateRequest en los ejemplos. En su lugar, necesito saber cómo agregar los roles del proveedor SqlRoleProvider predeterminado al usuario actual: cuándo y dónde hacerlo, y si tengo que hacer algo más para conectar mis nuevas clases con los otros proveedores predeterminados.
Sería increíble poder ir a una aplicación ASP.NET MVC 2 de muestra (de la plantilla de Visual Studio 2010, por ejemplo), realizar las modificaciones y hacer que funcione.
EDITAR: He editado la pregunta para mostrar mejor que estoy bastante perdido aquí, así que no puedo conformarme con respuestas de nivel demasiado alto.
PD: Me parece que tiene más sentido tener la ID en la Identidad en lugar de la principal, aunque en cierto modo ya lo he dicho antes.
No puede realmente esperar que alguien pueda enseñarle todo lo que no sabe sobre .NET en unos pocos párrafos. Puede leer un buen ejemplo en MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx y profundizar en la clase y sus derivados en Reflector: no hay nada espectacularmente especial .
Los roles son solo una serie de nombres para su propio uso, en su aplicación / servidor.
Habiendo dicho eso, realmente no tiene que apuntar exactamente al problema GenericPrincipal. Revisa
HttpContext.Current.Items
Es un Hashtable de uso gratuito solo para la solicitud que está atendiendo, lo que significa que en un momento dado puede decir:
HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there);
y luego cada otra cosa en el código simplemente haga:
var user = HttpContext.Current.Items["TokenUser"] as MyThinUser;
y ya está.
Almacene en su nueva clase todo lo que necesita / desea transmitir desde el código de autenticación a todas las demás funciones. Deja la propiedad del usuario intacta (para que pueda echarle un vistazo y no tener que preocuparse de que haya cambiado algo). Considere que puede simplificar o complicar su sistema a voluntad, pero que mantiene plena independencia.
Por ejemplo, si tiene su propia autenticación y solo unos pocos niveles de acceso en lugar de roles enumerados, puede llevar un buen número de nivel de acceso anterior (los roles enumerados como cadenas son muy ineficientes de todos modos).
Tenga en cuenta que las muestras autogeneradas en VS generalmente están orientadas hacia un escenario particular. Entonces, si ve proveedores de SQL para la administración de usuarios, eso no significa que realmente tenga que usarlo, aún puede llamar a su propio sproc para obtener lo que necesita de su propia tabla en SQL.