Подтвердить что ты не робот

Пользовательская авторизация 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" };
    }
}

Мой App.Config был обновлен по мере необходимости, а метод Evaluate в AuthorizationPolicy вызывается как ожидалось.

Однако, вот где я застрял. Как мне выполнить реализацию ролей и разрешений отсюда?

4b9b3361

Ответ 1

Я предлагаю вам выбрать Message Inspector.

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

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

Ответ 2

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

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

  • System.IdentityModel и System.Security.Principal

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

  • Политики, если вы хотите, чтобы мелкие ограничения политики безопасности