Ü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;
    }
}

}

Deinem letzten code-Beispiel erweitern RolePrincipal bewegt sich Weg von allem, was ich getan habe.

InformationsquelleAutor Jay | 2013-08-23

Schreibe einen Kommentar