net mvc example asp and asp.net-mvc-3 forms-authentication iprincipal iidentity custom-authentication

asp.net mvc 3 - example - Uso de IPrincipal e IIdentity personalizados en MVC3



authentication and authorization in asp net mvc 5 (1)

Tu error está aquí:

_application.AuthenticateRequest += ApplicationAuthenticateRequest;

Hay un HttpModule llamado RoleManagerModule que invoca un método en HttpApplication.PostAuthenticateRequest y establece HttpContext.Current.User en RolePrincipal . Por lo tanto, estaba configurando el User en AuthenticateRequest y RoleManagerModule establece en PostAuthenticateRequest , significa que después de su conjunto, anula su configuración. Cambia tu Module.Init :

public void Init(HttpApplication context) { _application = context; // change just this line: _application.PostAuthenticateRequest += ApplicationAuthenticateRequest; }

ACTUALIZACIÓN IMPORTANTE:

Por favor, vea esta pregunta, nuevamente preguntada por el iniciador, dependiendo de la pregunta actual, para una segunda solución, si esta no funciona.

Creo mi propia implementación de IPrincipal y IIdentity como se muestra a continuación:

[ComVisible(true)] [Serializable] public sealed class CustomIdentity : IIdentity { private readonly string _name; private readonly string _email; // and other stuffs public CustomIdentity(string name) { _name = name.Trim(); if(string.IsNullOrWhiteSpace(name)) return; _email = (connect to database and read email and other stuffs); } public string Name { get { return _name; } } public string Email { get { return _email; } } public string AuthenticationType { get { return "CustomIdentity"; } } public bool IsAuthenticated { get { return !string.IsNullOrWhiteSpace(_name); } } } [ComVisible(true)] [Serializable] public sealed class CustomPrincipal : IPrincipal { private readonly CustomIdentity _identity; public CustomPrincipal(CustomIdentity identity) { _identity = identity; } public bool IsInRole(string role) { return _identity != null && _identity.IsAuthenticated && !string.IsNullOrWhiteSpace(role) && Roles.IsUserInRole(_identity.Name, role); } IIdentity IPrincipal.Identity { get { return _identity; } } public CustomIdentity Identity { get { return _identity; } } }

Además, creo un HttpModule y en su evento AuthenticateRequest , hago esto:

public void Init(HttpApplication context) { _application = context; _application.AuthenticateRequest += ApplicationAuthenticateRequest; } private void ApplicationAuthenticateRequest(object sender, EventArgs e) { var formsCookie = _application.Request.Cookies[FormsAuthentication.FormsCookieName]; var identity = formsCookie != null ? new CustomIdentity(FormsAuthentication.Decrypt(formsCookie.Value).Name) : new CustomIdentity(string.Empty); var principal = new CustomPrincipal(identity); _application.Context.User = Thread.CurrentPrincipal = principal; }

Además, creo mi propio Controller y WebViewPage como estos:

public abstract class CustomController : Controller { public new CustomPrincipal User { get { var user = System.Web.HttpContext.Current.User as CustomPrincipal; return user; } } } public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel> { public new CustomPrincipal User { get { // (Place number 1) here is the error I''m speaking about!!! var user = HttpContext.Current.User as CustomPrincipal; return user; } } }

como se muestra en el código anterior, parece que todo está bien; Pero como puede ver, en el número 1 de Place, ¡no puedo acceder al CustomPrincipal ! Significa que en este lugar, tengo un RolePrincipal lugar de tener un CustomPrincipal . por ejemplo, HttpContext.Current.User es un RolePrincipal lugar de CustomPrincipal . Pero la propiedad RolePrincipal.Identity es una CustomIdentity !