0

Ich habe eine Anwendung mit Datenbank geerbt. Die Datenbank verfügt über folgende Tabellen zur Authentifizierung und Autorisierung.Implementieren rollenbasierte Autorisierung in MVC und Web-API mit benutzerdefinierten Tabelle

Benutzertabelle

Benutzername

Passwort

UserTypeId

Usertype Tabelle

UserTypeId

UserTypeDesc

Die Tabelle Benutzertyp speichert die Rollen für den Benutzer, z. Admin, Editor usw.

Wenn ich will Genehmigung implementieren, wie unten

[Authorize(Roles="Admin, Editor")] 
    public IHttpActionResult GetOrders() 
     { 
      //Code here 
     } 

Wo und was soll ich Code, so dass die Rollen auf das Autorisieren Attribut verfügbar sind?

bearbeiten

Ich habe bereits eine Datenbank. Daher kann ich die AspNetUserRoles- oder AspNetRoles-Tabellen nicht verwenden. Ich muss die Rollen mithilfe meiner benutzerdefinierten Tabellen festlegen.

EDIT2

Wie @Nkosi gefragt, hier ist der Code-Schnipsel, wie die Authentifizierung implementiert. Die eigentliche Implementierung ruft die Business-Schicht-Dienst und führt Verschlüsselung und andere Sachen, aber ich habe das Snippet vereinfacht

public HttpResponseMessage Authenticate(User user) 
{ 
    var isValid = myRepository.Exists(a => a.UserName == user.UserName &&  a.Password == user.Password); 
    if(isValid) 
    { 
    FormsAuthentication.SetAuthCookie(user.UserName,false); 
    } 
} 

Diese Methode aus der Login-Seite aufgerufen wird, wo Benutzer die Benutzernamen und Passwort

+1

Es ist nicht klar, was genau Sie fragen. –

+0

Ich habe mehr Text hinzugefügt. Ich hoffe, es ist jetzt klar – devanalyst

+0

Rollen unterstützen Attributautorisierung. Fragen Sie: Wie fügt man der Tabelle Rollen hinzu? Es ist noch unklar. Auch im Attribut müssen Sie Rollen eingeben. –

Antwort

1

diese Antworten als Referenz verwenden

Having Trouble with Forms Authentication Roles

FormsAuthentication Roles without Membership

Nach dem Auth Cookie auf Login gesetzt zu haben, wie Sie ursprünglich tat,

gehen Sie wie folgt in Ihrem Global.asax.cs

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 

    if (authCookie != null) 
    { 
     var ticket = FormsAuthentication.Decrypt(authCookie.Value); 

     FormsIdentity formsIdentity = new FormsIdentity(ticket); 

     ClaimsIdentity claimsIdentity = new ClaimsIdentity(formsIdentity); 

     //get the user from your custom tables/repository 
     var user = myUserRepository.GetUserByEmail(ticket.Name); 
     if(user!=null){ 
      var userTypeId = user.UserTypeId; 
      var role = myUserTypeRepository.GetUserTypeById(userTypeId); 
      if(role != null) { 
       //Assuming the roles for the user e.g. Admin, Editor, etc. 
       // is in the UserTypeDesc property 
       claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, role.UserTypeDesc)); 
      } 
     }  
     ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentity); 

     System.Threading.Thread.CurrentPrincipal = claimsPrincipal ; 
     if (System.Web.HttpContext.Current != null) { 
      System.Web.HttpContext.Current.User = claimsPrincipal ; 
     } 
    } 
} 

Die nette Sache über, wie sie es implementierten, ist, dass es Claims-basierte Rollen unter Verwendung der ClaimsIdentity und ClaimsPrincipal Objekte behandelt, ohne die Rollen in den Cookie des Benutzers zu setzen.Es behandelt auch die Authentifizierung in der Global.asax.cs-Datei, ohne auf benutzerdefinierte Autorisierungsattribute zurückgreifen zu müssen.

1

Ihre Frage sehr war betritt einfach. Sie müssen diese beiden Tabellen nur mit den Tabellen AspNetUserRoles und AspNetRoles synchronisieren. Tatsächlich überprüft das Autorize-Attribut standardmäßig diese beiden Tabellen. Ihre Rollen müssen sich also in ihnen widerspiegeln. Diese Tabellen werden standardmäßig von EF erstellt, wenn Sie das MVC-Vorlagenprojekt auswählen.

+0

Ich habe bereits eine vorhandene Datenbank, so dass ich nicht die AspNetUserRoles oder AspNetRoles-Tabellen verwenden können. Ich muss es für meine benutzerdefinierten Tabellen tun – devanalyst

+0

Ihre Anwendung verfügt nicht über diese Tabellen? Es ist möglich, dort Namen zu ändern, diese Tabellen können unter einem anderen Namen existieren –

+0

Jede MVC-Anwendung, die Identity verwendet, wird diese Tabellen oder entsprechende Tabellen mit anderen Namen haben –

Verwandte Themen