Ich verwende benutzerdefinierte Mitgliedschafts- und Rollenanbieter innerhalb des ASP.NET-Frameworks mit Formularauthentifizierung. Diese funktionieren großartig. Der Rollenanbieter verwendet einen Cookie, um die Rollen persistent zu machen und eine Reise in die Datenbank bei jeder Webanfrage zu speichern. Ich verwende auch die UserData-Zeichenfolge innerhalb des FormsAuthenticationTicket, um die UserId zu speichern.Können Sie das RolePrincipal in einem benutzerdefinierten IPrincipal-Objekt umbrechen?
Ich muss meine DAL aus dem Web-Projekt zu einem eigenen Projekt umgestalten. Die DAL ist abhängig vom Abrufen der ID des aktuellen Benutzers sowie von der Überprüfung der Rollen für Rechte. Wie sollte sich mein Authentifizierungssystem ändern, damit ich das Thread.CurrentPrincipal verwenden kann, ohne System.Web im DAL-Projekt zu referenzieren?
Derzeit erstellt das Provider-Framework ein RolePrincipal- und FormsIdentity-Objekt und fügt es dem Thread.CurrentPrincipal an.
Ich dachte darüber nach, einen benutzerdefinierten IPrincipal-Wrapper um das RolePrincipal während des Application_PostAuthenticateRequest-Ereignisses zu erstellen. In diesem Fall kann ich die UserID von FormsAuthentalTicket abrufen und sie zusammen mit dem RolePrincipal an diesen neuen WrapperPrincipal übergeben.
Ist dies ein gültiger Ansatz? Wird es am Ende einige Probleme im Projekt geben, indem ich mich mit der Provider-Struktur herumärbe?
Danke, Keith
protected void Application_PostAuthenticateRequest()
{
if (Request.IsAuthenticated)
{
FormsIdentity identity = (FormsIdentity)User.Identity;
if (identity != null)
{
FormsAuthenticationTicket ticket = identity.Ticket;
int id = 1;
if (identity != null)
{
int.TryParse(identity.Ticket.UserData, out id);
}
var wrapperPrincipal = new WrapperPrincipal(User, id);
System.Threading.Thread.CurrentPrincipal = WrapperPrincipal;
}
}
}
[Serializable]
public class WrapperPrincipal : IPrincipal
{
private IPrincipal principal;
public WrapperPrincipal(IPrincipal principal, int userId)
{
this.principal = principal;
this.Id = userId;
}
public int Id { get; set; }
public IIdentity Identity
{
get { return principal.Identity; }
}
public bool IsInRole(string role)
{
return principal.IsInRole(role);
}
}
Ich habe ein paar Zweifel und ich bin wirklich interessiert am Ergebnis Ihrer Frage. Können Sie Ihre Schlussfolgerung teilen, wenn Sie zu irgendeinem gekommen sind? –
Erweitern Sie einfach Ihr WrapperPrincipal mit RolePrincipal, statt IPrincipal zu verwenden, und entfernen Sie die IPrimin-Implementierungsmethoden und -eigenschaften. Das RolePrincipal implementiert IPrincipal – user357086