Ich bin ein Intranet Anwendung mit MVC3 mit einem MSSQL-Backend bauen. Ich habe Authentifizierung und Rollen (über einen benutzerdefinierten Rollenanbieter) ordnungsgemäß funktioniert. Ich versuche jetzt, User.Identity zu überschreiben, um Elemente wie User.Identity.FirstName zuzulassen. Aber ich kann keinen Code finden, die mir zeigen, wie dies in WindowsMVC3 Windows-Authentifizierung überschreiben User.Identity
Ich habe versucht, einen benutzerdefinierten Anbieter zu schreiben:
public class CPrincipal : WindowsPrincipal
{
UserDAL userDAL = new UserDAL();
public CPrincipal(WindowsIdentity identity)
: base(identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.identity = identity;
}
public UserInfo userInfo { get; private set; }
public WindowsIdentity identity { get; private set; }
}
und Überschreiben die WindowsAuthentication das benutzerdefinierte Haupt zu füllen.
void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e)
{
if (e.Identity != null && e.Identity.IsAuthenticated)
{
CPrincipal cPrincipal = new CPrincipal(e.Identity);
HttpContext.Current.User = cPrincipal;
}
}
Ich habe einen Haltepunkt in der Authentifizierungsfunktion und der Prinzipal wird bevölkert; Wenn ich jedoch einen Haltepunkt in die Controller setze, ist der Benutzer nur das normale RolePrincipal, anstelle meines benutzerdefinierten Principals. Was mache ich falsch?
EDIT:
bemerkte ich aus dem Code oben in der global.asax. Ich habe die AuthorizeAttribute mit C# außer Kraft gesetzt:
public class CAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
return false;
}
IIdentity user = httpContext.User.Identity;
CPrincipal cPrincipal = new CPrincipal(user);
httpContext.User = cPrincipal;
return true;
}
}
Und mein Auftraggeber die angepasst folgende:
public class CPrincipal : IPrincipal
{
private UserDAL userDAL = new UserDAL();
public CPrincipal(IIdentity identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.Identity = identity;
}
public UserInfo userInfo { get; private set; }
public IIdentity Identity { get; private set; }
public bool IsInRole(string role)
{
throw new NotImplementedException();
}
}
Jetzt habe ich, wenn ich in einen Haltepunkt setzen, zeigt die Uhr in Benutzer die folgenden:
- Benutzer
- [CSupport.Model.CPrincipal]
- Identität
Identität ist zugänglich; es ist jedoch immer noch die WindowsIdentity CPrincipal ist nur in der Uhr zugänglich und nicht direkt zugänglich.
EDIT: Danke an alle, die dazu beigetragen haben. Sie haben mein Verständnis der Funktionsweise der verschiedenen Teile erheblich erweitert.
Ich hatte beide Möglichkeiten zu arbeiten, also dachte ich, ich würde teilen.
Option 1: Überschreiben Sie die Autorisieren Anfrage in Global.asax
Das ist das, was ich mit gehe.
Ich habe Application_AuthenticateRequest nicht verwendet, weil (entsprechend: HttpContext.Current.User is null even though Windows Authentication is on) der Benutzer nicht in einem Windows-Authentifizierungsprozess ausgefüllt wurde und daher gibt es nichts, das ich verwenden kann, um die Benutzerinformationen abzurufen.
Application_AuthorizeRequest ist der nächste in der Kette und passiert, nachdem die Windows-Identität eingegeben wurde.
protected void Application_AuthorizeRequest(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated && Roles.Enabled)
{
Context.User = new FBPrincipal(HttpContext.Current.User.Identity);
}
}
Dies ist die Überschreibung der Haupt
public class CPrincipal : IPrincipal
{
private UserDAL userDAL = new UserDAL();
public CPrincipal(IIdentity identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.Identity = identity;
}
public UserInfo userInfo { get; private set; }
public IIdentity Identity { get; private set; }
public bool IsInRole(string role)
{
return userDAL.IsUserInRole(userInfo.UserName, role);
}
}
Dies ist, wie Sie die aktualisierte Informationen in dem neuen Haupt zuzugreifen, die erstellt wurde.
[Authorize(Roles = "super admin")]
public ActionResult Dashboard()
{
string firstname = (User as CPrincipal).userInfo.FirstName; // <--
DashboardModel dModel = reportDAL.GetChartData();
return View(dModel);
}
Option 2: Überschreiben Sie die AuthorizeAttribute
Dies ist die überschriebene Auftraggeber ist (Es ist das gleiche wie oben)
public class CPrincipal : IPrincipal
{
private UserDAL userDAL = new UserDAL();
public CPrincipal(IIdentity identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.Identity = identity;
}
public UserInfo userInfo { get; private set; }
public IIdentity Identity { get; private set; }
public bool IsInRole(string role)
{
return userDAL.IsUserInRole(userInfo.UserName, role);
}
}
Hier ist die Überschreibung der Autorisieren
Attributpublic class CAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
return false;
}
IIdentity user = httpContext.User.Identity;
CPrincipal cPrincipal = new CPrincipal(user);
httpContext.User = cPrincipal;
return true;
}
}
Hier können Sie das AuthorizeAttribute ändern, um die neuen Informa zu verwenden und zu verwenden tion.
Option 1 behandelt alles global, Option 2 behandelt alles auf einer individuellen Ebene.
Warten ... Was ist das Ereignishandler? Sie versuchen nicht, das ASP.NET-Login-Steuerelement zu verwenden? Wo befindet sich dieses Ereignis und an welches Ereignis knüpft es an? –
Ich verwende Windows-Authentifizierung auf einer Intranetsite. Dieser Event-Handler befindet sich im globalen Bereich.asax –
In global.asax gibt es keinen OnAuthenticate-Handler. Wahrscheinlich hast du deswegen Probleme. –