В WCF пользовательский авторизации

в основном, я создаю свой первый веб-сервис WCF, и я хочу реализовать пользовательскую аутентификацию и авторизацию. Аутентификация, похоже, работает хорошо, но я хочу иметь возможность хранить роли и разрешения, используя пользовательскую авторизацию.

моя аутентификация выполняется путем переопределения UserNamePasswordValidator и использование Validate метод.

Validate(string UserName, string password)

теперь я попытался реализовать авторизацию с помощью IAuthorizationPolicy интерфейс

public class AuthorizationPolicy : IAuthorizationPolicy
{
    private string _id;

    public string Id
    {
        get { return this._id; }
    }

    public ClaimSet Issuer
    {
        get { return ClaimSet.System; }
    }

    public AuthorizationPolicy()
    {
        _id = Guid.NewGuid().ToString();
    }

    public bool Evaluate(EvaluationContext context, ref object state)
    {
        IIdentity client = GetClientIdentity(context);
        context.Properties["Principal"] = new CustomPrincipal(client);

        return true;
    }

    private IIdentity GetClientIdentity(EvaluationContext evaluationContext)
    {
        object obj;
        if (!evaluationContext.Properties.TryGetValue("Identities", out obj))
            throw new Exception("No Identity found");

        IList<IIdentity> identities = obj as IList<IIdentity>;
        if (identities == null || identities.Count <= 0)
            throw new Exception("No Identity found");

        return identities[0];
    }
}

и я также реализовал CustomPrincipal С помощью IPrincipal интерфейс.

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

    public CustomPrincipal(IIdentity identity)
    {
        _identity = identity;
    }

    public static CustomPrincipal Current
    {
        get
        {
            return Thread.CurrentPrincipal as CustomPrincipal;
        }
    }

    public IIdentity Identity
    {
        get { return _identity; }
    }

    public string[] Roles
    {
        get
        {
            if (_roles == null)
            {
                EnsureRoles();
            }

            return _roles;
        }
    }

    public bool IsInRole(string role)
    {
        EnsureRoles();

        return _roles.Contains(role);
    }

    protected virtual void EnsureRoles()
    {
        UserManager userManager = new UserManager();
        int userPermissions = userManager.UserPermissions(_identity.Name);

        if (userPermissions == 1)
            _roles = new string[1] { "ADMIN" };
        else
            _roles = new string[1] { "USER" };
    }
}

Мои Приложения.Конфигурация была обновлена по мере необходимости, и Evaluate метод AuthorizationPolicy называется, как ожидалось.

однако, здесь я застрял. Как я могу реализовать роли и разрешения отсюда?

2 ответов


Я бы предложил вам выбрать Инспектором Сообщение.

логика была бы следующей:

  1. клиент будет иметь инспектор сообщений, который установит необходимые заголовки для каждого запроса.
  2. инспектор сообщений на стороне сервера перехватит запрос, а затем прочитает заголовки и выполнит аутентификацию и авторизацию.
  3. у вас может быть несколько служб, таких как служба пользователя и роли, которые могут быть вызваны на сервере для проверьте учетные данные в заголовке и задайте идентификатор для этого запроса.
  4. эти службы будут получать доступ к магазину через DAL и будут находиться в режиме inproc.

вы можете обратиться к аутентификация и авторизация с помощью ASP.NET идентификатор 2.0 для служб WCF

в основном у вас будет 3 уровня для рассмотрения в соответствии с этой статьей:

  1. Asp.net Identity 2.0, Если вы хотите использовать контекст out of the box, общий с приложениями MVC; или вы используете свою пользовательскую базу данных.

  2. политика если вы хотите мелкозернистые элементы управления политикой безопасности