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
!