17

creo mi propia IPrincipal y IIdentity aplicación como se muestra a continuación:usando encargo IPrincipal y IIdentity en MVC3

[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, se crea un HttpModule y en su caso 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 propia 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 Número de lugar 1 No puedo acceder al CustomPrincipal! Significa en este lugar, tengo un RolePrincipal en lugar de tener un CustomPrincipal. p.ej. HttpContext.Current.User es un RolePrincipal en lugar de CustomPrincipal. ¡Pero la propiedad RolePrincipal.Identity es CustomIdentity!

Respuesta

19

Su error es aquí:

_application.AuthenticateRequest += ApplicationAuthenticateRequest; 

No es un llamado HttpModuleRoleManagerModule que invoca un método en el HttpApplication.PostAuthenticateRequest y establece el HttpContext.Current.User-RolePrincipal. Por lo tanto, estaba configurando el User en AuthenticateRequest y RoleManagerModule lo establece en PostAuthenticateRequest, significa después de su conjunto, por lo que anula su configuración. Cambiar su Module.Init:

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

ACTUALIZACIÓN IMPORTANTE:

favor ver this question -preguntó por arranque de nuevo, dependía de pregunta-corriente para una segunda solución, si ésta no funciona.

+0

¡Funciona! Muchas gracias. –

+0

Gracias por esta respuesta; ¡Estaba tirando de mi cabello tratando de entender esto! –

+0

@DavidKeaveny Gracias, pero tengo que decirte que la solución todavía tiene un problema. Busque en las preguntas de 'king.net', puede encontrar una Q asociada a esto que indique que hay otro problema con IIS, por lo que sugiero una forma para que él/ella resuelva el problema. Por favor mire las preguntas de 'king.net', lo encontrará. Saludos. –

Cuestiones relacionadas