asp.net extending IPrincipal

痞子三分冷 提交于 2019-12-05 03:32:19
SLaks

You can make an extension method:

public static string UserType(this IPrincipal principal) {
    // do some database access 
    return something;
}
Johannes Setiabudi

Sure. Make your class implements IPrincipal:

public class MyPrinciple : IPrincipal {
    // do whatever
}

Extension method:

public static string UserType(this MyPrinciple principle) {
    // do something
}
Doug

Here is an example custom class that implements IPrincipal. This class includes a few extra methods to check for role affiliation but shows a property named UserType per your requirements.

  public class UserPrincipal : IPrincipal
  {
    private IIdentity _identity;
    private string[] _roles;

    private string _usertype = string.Empty;


    public UserPrincipal(IIdentity identity, string[] roles)
    {
      _identity = identity;
      _roles = new string[roles.Length];
      roles.CopyTo(_roles, 0);
      Array.Sort(_roles);
    }

    public IIdentity Identity
    {
      get
      {
        return _identity;
      }
    }

    public bool IsInRole(string role)
    {
      return Array.BinarySearch(_roles, role) >= 0 ? true : false;
    }

    public bool IsInAllRoles(params string[] roles)
    {
      foreach (string searchrole in roles)
      {
        if (Array.BinarySearch(_roles, searchrole) < 0)
        {
          return false;
        }
      }
      return true;
    }

    public bool IsInAnyRoles(params string[] roles)
    {
      foreach (string searchrole in roles)
      {
        if (Array.BinarySearch(_roles, searchrole) > 0)
        {
          return true;
        }
      }
      return false;
    }

    public string UserType
    {
      get
      {
        return _usertype;
      }
      set
      {
        _usertype = value;
      }
    }

  }

Enjoy!

Basically, no. You can implement IPrincipal with a class such as MyPrincipal, and that class can have a UserType property, but you'd have to access the instance through a reference of its own type in order to reach it, not through the interface reference.

edit

An extension method could work, but only if you're absolutely certain you'll never call it on something that implements IPrincipal but isn't an instance of your own class.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!