Überschreiben Sie den Nutzer."IsInRole", und [Ermächtige(Roles = "Admin")] für das MVC4-Anwendung
Habe ich eine benutzerdefinierte Rolle, die provider für meine MVC4-Anwendung, wo ich war erfolgreich in der Lage, überschreiben, CreateRole, GetAllRoles und RoleExists Methoden und verknüpfen diese mit meiner bestehenden Datenbank wie folgt:
namespace Project.Providers
{
public class MyProvider : System.Web.Security.SqlRoleProvider
{
private MyContext dbcontext = new MyContext(System.Configuration.ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString);
private Repository<MyUser> userRepository;
private Repository<Role> roleRepository;
public MyProvider()
{
this.userRepository = new Repository<MyUser>(dbcontext);
this.roleRepository = new Repository<Role>(dbcontext);
}
public override string[] GetAllRoles()
{
IEnumerable<Role> dbRoles = roleRepository.GetAll();
int dbRolesCount = roleRepository.GetAll().Count();
string[] roles = new string[dbRolesCount];
int i = 0;
foreach(var role in dbRoles)
{
roles[i] = role.Name;
i++;
}
return roles;
}
public override bool RoleExists(string roleName)
{
string[] roles = { "Admin", "User", "Business" };
if(roles.Contains(roleName))
return true;
else
return false;
}
public override void CreateRole(string roleName)
{
Role newRole = new Role();
newRole.Name = roleName;
roleRepository.Add(newRole);
roleRepository.SaveChanges();
}
public override bool IsUserInRole(string userName, string roleName)
{
MyUser user = userRepository.Get(u => u.Username == userName).FirstOrDefault();
Role role = roleRepository.Get(r => r.Name == roleName).FirstOrDefault();
if (user.RoleID == role.RoleID)
return true;
else
return false;
}
}
}
Habe ich nicht in der Lage war, einen Weg zu finden, um das überschreiben der
User.IsInRole(string roleName)
Was muss ich tun, Wenn ich verwende:
[Authorize(Roles = "Admin")]
Wird er sich auf die Rolle der Anbieter, die ich eingerichtet habe und nicht die asp default.
Meiner user-Klasse ist nun wie folgt:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.Collections;
using System.Security.Principal;
namespace Project.Data
{
public class MyUser : IPrincipal
{
[Key]
public int UserID { get; set; }
[StringLength(128)]
public string Username { get; set; }
.....other properties
public IIdentity Identity { get; set; }
public bool IsInRole(string role)
{
if (this.Role.Name == role)
{
return true;
}
return false;
}
public IIdentity Identity
{
get { throw new NotImplementedException(); }
}
}
}
Meine stack-trace zu Folgen scheint, über:
System.Web.Security.RolePrincipal.IsInRole(String role)
Also habe ich versucht zu implementieren eines benutzerdefinierten RolePrincipal in der gleichen Weise, die ich den benutzerdefinierten Anbieter irgendwelche Ideen, wie ich dies tun kann? Nicht sicher, was Konstruktor Parameter es braucht. Hier ist mein Versuch:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration.Provider;
using Project.Data;
using System.Web.Security;
using System.Security.Principal.IIdentity;
namespace Project.Principal
{
public class MyPrincipal : System.Web.Security.RolePrincipal
{
private MyContext dbcontext = new MyContext(System.Configuration.ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString);
private Repository<MyUser> userRepository;
private Repository<Role> roleRepository;
public MyPrincipal()
{
this.userRepository = new Repository<MyUser>(dbcontext);
this.roleRepository = new Repository<Role>(dbcontext);
}
public override bool IsInRole(string role)
{
//code to be added
return true;
}
}
}
InformationsquelleAutor Jay | 2013-08-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nur zu überschreiben-Methode GetRolesForUser in Ihre benutzerdefinierte Rolle, die Anbieter, anstelle der logischen IsUserInRole, denn das ist, was man von der default-Implementierung, die einige unerwünschte Zwischenspeichern.
InformationsquelleAutor Monoman
Überschreiben Sie "IsInRole" - in Ihrem IPrincipal-Klasse, mir in EF sieht wie folgt aus:
Dann, wenn Sie fügen Sie die entsprechenden Abschnitte in Ihrer webconfig für beide RoleProvider und MembershipProvider Sie sollten gut für Autorisieren-Attribut.
UPDATE in Reaktion auf Ihre Kommentare
web-Config sollte so Aussehen:
In der Anbieter, ist der Benutzer Ihre
IPrincipal
?Benutzer haben sollte und
IIdentity
in MyUser.cs:
Ich habe nicht viel zusätzliche Hinweise zum beheben von Ihre Kommentare.
UPDATE
Einige Beispiele habe ich durch und fand die hilfreich sind, wenn Einstellung von mir:
http://www.brianlegg.com/post/2011/05/09/Implementing-your-own-RoleProvider-and-MembershipProvider-in-MVC-3.aspx
http://www.mattwrock.com/post/2009/10/14/Implementing-custom-MembershipProvider-and-Role-Provider-for-Authinticating-ASPNET-MVC-Applications.aspx
http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx?Redirected=true
Ich lese viele andere Artikel und SO posts auf meinen ersten run durch, aber das waren Dinge, die ich die Mühe gemacht, Lesezeichen. Ich nahm ein Rollen - /Rechte-Ansatz die Genehmigung, die ist, warum einer von Ihnen ist darauf ausgerichtet, die Art und Weise.
Ich habe implementiert die Schnittstelle, indem Sie auf das Ende des IPrincipal-und-Klick ALT + UMSCHALT + F10. Jetzt bin ich immer eine Nicht statische Methode erfordert ein Ziel-Fehler
Mein stack-trace zu Folgen scheint, über auf: System.Web.Sicherheit.RolePrincipal.IsInRole(String Rolle) habe ich versucht zu implementieren eines benutzerdefinierten RolePrincipal in der gleichen Weise, die ich den benutzerdefinierten Anbieter irgendwelche Ideen, wie ich dies tun kann? Nicht sicher, was Konstruktor params dauert es
Vielleicht brauche ich nur zum einstellen der Mitgliedschaftsanbieter mit dieser info
Ihre benutzerdefinierten Mitgliedschaftsanbieter ist, wo Sie das tun - nicht die benutzerdefinierte Funktion, die Anbieter
InformationsquelleAutor Matthew
Dieses Problem zu beheben, müssen Sie 4 updates für Ihre Anwendung.
InformationsquelleAutor Ziregbe Otee