Поделиться через


Инструкции: доступ к утверждениям на странице ASP.NET

Windows® Identity Foundation (WIF) предоставляет элементы управления времени разработки и модель программирования модуля федеративной проверки подлинности (WS-FAM), что позволяет разработчикам ASP.NET принимать маркеры от вызывающей стороны страницы ASP.NET. Эти маркеры содержат сведения о вызывающей стороне, которые WIF отображает для разработчиков как утверждения. В данном разделе показано, как получить доступ к этим утверждениям.

Чтобы получить доступ к утверждениям

Чтобы получить доступ к информации об удостоверениях, можно запустить FedUtil. Дополнительные сведения см. в разделе Установление отношения доверия между приложением проверяющей стороны ASP.NET и службой STS с помощью FedUtil. После запуска FedUtil приложение получает доступ к IClaimsPrincipal и IClaimsIdentity, используя стандартные конструкции ASP.NET, как показано в следующем примере кода:

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = Thread.CurrentPrincipal as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claims foreach(Claim claim in claimsIdentity.Claims) {

    } }

Чтобы перечислить утверждения пользователя

Получив доступ к IClaimsIdentity, можно перечислить утверждения, выполняя итерацию по коллекции утверждений. В следующем примере кода показаны все свойства утверждений (такие как типы утверждений, значения утверждений и типы значений утверждений), которые WIF извлекает из входящего маркера безопасности. Кроме того, см. раздел "Приступая к работе" или пример простого веб-приложения, поддерживающего утверждения, в каталоге примеров.

Примечание

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

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = Thread.CurrentPrincipal as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claims foreach(Claim claim in claimsIdentity.Claims) { Response.Write(claim.ClaimType) + "<BR>"; Response.Write(claim.Value) + "<BR>"; Response.Write(claim.ValueType) + "<BR>"; } }

Чтобы получить доступ к конкретному утверждению

Получив доступ к IClaimsIdentity, можно получить доступ к конкретному утверждению, найдя заданный тип утверждения в коллекции Claims. Это можно сделать либо с помощью итерации по утверждениям в коллекции, либо с помощью LINQ.

В следующем примере кода показано, как это делается с помощью итерации по утверждениям в коллекции.

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = User as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claims foreach(Claim claim in claimsIdentity.Claims) { if(claim.ClaimType == "http://GenevaFramework/AgeClaim") { Response.Write("Age Claim: " + claim.Value); break; } } }

В следующем примере кода показано, как это делается с помощью LINQ.

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = User as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claim string ageClaimValue;

    try { ageClaimValue = ( from c in claimsIdentity.Claims where c.ClaimType == "http://GenevaFramework/AgeClaim" select c.Value ).Single(); } catch (InvalidOperationException) { ageClaimValue = "Age claim wasn’t found or " + "there were more than one Age claims provided"; }

    Response.Write("Age Claim: " + ageClaimValue); }