ClaimsAuthorizationManager.CheckAccess(AuthorizationContext) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Cuando se implementa en una clase derivada, comprueba la autorización para el asunto en el contexto especificado para realizar la acción especificada en el recurso especificado.
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
Parámetros
- context
- AuthorizationContext
El contexto de autorización que contiene el asunto, el recurso y la acción para los que debe comprobarse la autorización.
Devoluciones
true
si el sujeto tiene autorización para realizar la acción especificada en el recurso especificado; si no, false
.
Ejemplos
Los ejemplos de código que se usan en los ClaimsAuthorizationManager temas se toman del Claims Based Authorization
ejemplo. En este ejemplo se proporciona un administrador de autorización de notificaciones personalizado que puede autorizar sujetos en función de una directiva especificada en la configuración. El administrador de autorización de notificaciones personalizado consta de tres componentes básicos: una clase derivada de ClaimsAuthorizationManager que implementa el administrador, la ResourceAction
clase que empareja un recurso y una acción, y un lector de directivas que lee y compila la directiva especificada en el archivo de configuración. A continuación, el administrador de autorización de notificaciones puede usar esta directiva compilada para evaluar una entidad de seguridad con el fin de autorizar el acceso a los recursos. No todos los elementos se muestran por motivos de brevedad. Para obtener información sobre este ejemplo y otros ejemplos disponibles para WIF y sobre dónde descargarlos, consulte Índice de ejemplo de código de WIF.
En el código siguiente se muestra la invalidación del CheckAccess método . Este método concede o deniega el acceso en función de una directiva de lectura y compilación del archivo de configuración.
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;
}
}
En el código siguiente se muestra la ResourceAction
clase usada por el administrador de notificaciones personalizado.
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;
}
}
}
La directiva utilizada por el administrador de autorización de notificaciones se especifica mediante elementos personalizados <policy>
en el <elemento claimsAuthorizationManager> . El método lee y compila LoadCustomConfiguration esta directiva. En la primera directiva, la entidad de seguridad debe poseer una de las notificaciones especificadas para realizar la acción especificada en el recurso especificado. En la segunda directiva, la entidad de seguridad debe poseer ambas notificaciones para poder realizar la acción especificada en el recurso especificado. En todos los demás, a la entidad de seguridad se le concede acceso automáticamente independientemente de las reclamaciones que posee.
<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>
Comentarios
La implementación base siempre devuelve true
, que autoriza el acceso. Puede invalidar este método en una clase derivada para autorizar el acceso en función de los requisitos de la aplicación rp. Si este método devuelve false
, Windows Identity Foundation (WIF) devuelve un error no autorizado al autor de la llamada; de lo contrario, la ejecución se pasa a la aplicación rp.