ClaimsAuthorizationManager.CheckAccess(AuthorizationContext) Метод

Определение

При реализации в производном классе проверяет авторизацию для субъекта в указанном контексте, чтобы выполнить заданное действие в указанном ресурсе.

public:
 virtual bool CheckAccess(System::Security::Claims::AuthorizationContext ^ context);
public virtual bool CheckAccess (System.Security.Claims.AuthorizationContext context);
abstract member CheckAccess : System.Security.Claims.AuthorizationContext -> bool
override this.CheckAccess : System.Security.Claims.AuthorizationContext -> bool
Public Overridable Function CheckAccess (context As AuthorizationContext) As Boolean

Параметры

context
AuthorizationContext

Контекст авторизации, который содержит тему, ресурс и действие, для которых необходимо проверить авторизацию.

Возвращаемое значение

Boolean

Значение true, если субъекту разрешено выполнение указанного действия с указанным ресурсом; в противном случае — значение false.

Примеры

Примеры кода, используемые в ClaimsAuthorizationManager разделах, взяты из Claims Based Authorization примера. Этот пример предоставляет пользовательский диспетчер авторизации утверждений, который может авторизовать субъекты на основе политики, указанной в конфигурации. Пользовательский диспетчер авторизации утверждений состоит из трех основных компонентов: класса, производного от ClaimsAuthorizationManager этого, который реализует диспетчер, класс, ResourceAction который связывает ресурс и действие, а также средство чтения политики, которое считывает и компилирует политику, указанную в файле конфигурации. Затем эту скомпилированную политику можно использовать диспетчером авторизации утверждений для оценки участника для авторизации доступа к ресурсам. Не все элементы отображаются ради краткости. Сведения об этом образце и других примерах, доступных для WIF и о том, где их скачать, см. в разделе "Пример кода WIF".

В следующем коде показано переопределение CheckAccess метода. Этот метод предоставляет или запрещает доступ на основе политики чтения и компиляции из файла конфигурации.

static Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>> _policies = new Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>>();
PolicyReader _policyReader = new PolicyReader();
    /// <summary>
    /// Checks if the principal specified in the authorization context is authorized to perform action specified in the authorization context 
    /// on the specified resoure
    /// </summary>
    /// <param name="pec">Authorization context</param>
    /// <returns>true if authorized, false otherwise</returns>
    public override bool CheckAccess(AuthorizationContext pec)
    {
        //
        // Evaluate the policy against the claims of the 
        // principal to determine access
        //
        bool access = false;
        try
        {
            ResourceAction ra = new ResourceAction(pec.Resource.First<Claim>().Value, pec.Action.First<Claim>().Value);

            access = _policies[ra](pec.Principal);
        }
        catch (Exception)
        {
            access = false;
        }

        return access;
    }
}

В следующем коде показан класс, ResourceAction используемый пользовательским диспетчером утверждений.


using System;

namespace ClaimsAuthorizationLibrary
{
    /// <summary>
    /// Class to encapsulate resource/action pair
    /// </summary>
    public class ResourceAction
    {
        public string Resource;
        public string Action;

        /// <summary>
        /// Checks if the current instance is equal to the given object by comparing the resource and action values
        /// </summary>
        /// <param name="obj">object to compare to</param>
        /// <returns>True if equal, else false.</returns>
        public override bool Equals(object obj)
        {
            ResourceAction ra = obj as ResourceAction;
            if (ra != null)
            {
                return ((string.Compare(ra.Resource, Resource, true) == 0) && (string.Compare(ra.Action, Action, true) == 0));
            }

            return base.Equals(obj);
        }

        /// <summary>
        /// Gets the hash code.
        /// </summary>
        /// <returns>The hash code.</returns>
        public override int GetHashCode()
        {
            return (Resource + Action).ToLower().GetHashCode();
        }

        /// <summary>
        /// Creates an instance of ResourceAction class.
        /// </summary>
        /// <param name="resource">The resource name.</param>
        /// <param name="action">The action.</param>
        /// <exception cref="ArgumentNullException">when <paramref name="resource"/> is null</exception>
        public ResourceAction(string resource, string action)
        {
            if (string.IsNullOrEmpty(resource))
            {
                throw new ArgumentNullException("resource");
            }

            Resource = resource;
            Action = action;
        }
    }
}

Политика, используемая диспетчером авторизации утверждений, задается пользовательскими <policy> элементами в элементе <claimsAuthorizationManager> . Эта политика считывается и компилируется методом LoadCustomConfiguration . В первой политике субъект должен обладать одним из указанных утверждений, чтобы выполнить указанное действие с указанным ресурсом. Во второй политике субъект должен обладать обоими утверждениями, чтобы иметь возможность выполнять указанное действие для указанного ресурса. Во всех остальных, субъект автоматически получает доступ независимо от утверждений, которыми он обладает.

<system.identityModel>
  <identityConfiguration>
    <claimsAuthorizationManager type="ClaimsAuthorizationLibrary.MyClaimsAuthorizationManager, ClaimsAuthorizationLibrary">
      <policy resource="http://localhost:28491/Developers.aspx" action="GET">
        <or>
          <claim claimType="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" claimValue="developer" />
          <claim claimType="http://schemas.xmlsoap.org/claims/Group" claimValue="Administrator" />
        </or>
      </policy>
      <policy resource="http://localhost:28491/Administrators.aspx" action="GET">
        <and>
          <claim claimType="http://schemas.xmlsoap.org/claims/Group" claimValue="Administrator" />
          <claim claimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country" claimValue="USA" />
        </and>
      </policy>
      <policy resource="http://localhost:28491/Default.aspx" action="GET">
      </policy>
      <policy resource="http://localhost:28491/" action="GET">
      </policy>
      <policy resource="http://localhost:28491/Claims.aspx" action="GET">
      </policy>
    </claimsAuthorizationManager>

    ...

  </identityConfiguration>
</system.identityModel>

Комментарии

Базовая реализация всегда возвращается true, что разрешает доступ. Этот метод можно переопределить в производном классе, чтобы авторизовать доступ на основе требований приложения RP. Если этот метод возвращаетсяfalse, Windows Identity Foundation (WIF) возвращает несанкционированную ошибку вызывающей объекту; в противном случае выполнение передается приложению RP.

Применяется к