이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
방법: OAuth WRAP 프로토콜을 통해 ACS에서 토큰 요청
Collapse the table of content
Expand the table of content

방법: OAuth WRAP 프로토콜을 통해 ACS에서 토큰 요청

업데이트 날짜: 2015년 6월

  • Microsoft Azure Active Directory 액세스 제어(액세스 제어 서비스 또는 ACS라고도 함)

웹 응용 프로그램 및 서비스에서 ACS를 사용하여 인증을 처리하는 경우 클라이언트는 ACS에서 발급한 보안 토큰을 가져와야 응용 프로그램 또는 서비스에 로그인할 수 있습니다. 이 ACS 발급 토큰(출력 토큰)을 가져오기 위해 클라이언트는 ACS에 직접 인증하거나 해당 ID 공급자가 발급한 보안 토큰(입력 토큰)을 ACS로 보내야 합니다. ACS는 이 입력 보안 토큰의 유효성을 검사하고, ACS 규칙 엔진을 통해 이 토큰의 ID 클레임을 처리하며, 출력 ID 클레임을 계산하고, 출력 보안 토큰을 발급합니다.

이 항목에서는 OAuth WRAP 프로토콜을 통해 ACS에서 토큰을 요청하는 방법에 대해 설명합니다. OAuth WRAP 프로토콜을 통한 모든 토큰 요청은 SSL을 통해 전송됩니다. ACS에서는 항상 올바른 형식의 토큰 요청에 대한 응답으로 OAuth WRAP 프로토콜을 통해 SWT(단순 웹 토큰)를 발급합니다. OAuth WRAP 프로토콜을 통한 모든 토큰 요청은 HTTP POST에서 ACS로 전송됩니다. .NET Framework, WCF(Windows Communication Foundation), Silverlight, ASP.NET, Java, Python, Ruby, PHP, Flash 등 HTTPS FORM POST를 만들 수 있는 모든 플랫폼에서 OAuth WRAP 프로토콜을 통해 ACS 토큰을 요청할 수 있습니다.

다음 표에는 OAuth WRAP 프로토콜을 통해 ACS 발급 SWT 토큰을 요청하는 데 지원되는 세 가지 방법이 나와 있습니다.

OAuth WRAP 프로토콜을 통해 ACS에서 토큰을 요청하는 세 가지 방법

토큰 요청 방법 설명

암호 토큰 요청

이 가장 간단한 방법에서는 클라이언트가 인증을 위해 서비스 ID의 사용자 이름 및 암호를 OAuth WRAP 프로토콜을 통해 ACS로 직접 전송해야 합니다.

SWT 토큰 요청

이 방법에서는 클라이언트가 인증을 위해 서비스 ID 대칭 키 또는 ID 공급자 대칭 키로 서명될 수 있는 SWT 토큰을 OAuth WRAP 프로토콜을 통해 ACS로 전송해야 합니다.

SAML 토큰 요청

주로 AD FS(Active Directory Federation Service) 2.0 통합에 사용되는 SAML(Security Assertion Markup Language) 방법에서는 클라이언트가 인증을 위해 서명된 SAML 토큰을 OAuth WRAP 프로토콜을 통해 ACS로 전송해야 합니다. 이 접근 방식을 사용할 경우 클라이언트는 엔터프라이즈 ID를 사용하여 ACS에 인증할 수 있습니다.

OAuth WRAP 프로토콜을 통한 모든 ACS 토큰 요청은 ACS 토큰 발급 끝점으로 전송됩니다. 이 끝점의 URI는 액세스 제어 네임스페이스에 따라 다릅니다. 이 네임스페이스는 토큰 요청 URI에 DNS 이름 접두사로 표시됩니다. DNS 이름의 나머지는 고정된 경로입니다. 예를 들어 액세스 제어 네임스페이스에서 "mysnservice"라는 토큰을 요청하려는 경우 URI https://mysnservice.accesscontrol.windows.net/WRAPv0.9로 토큰 요청을 보낼 수 있습니다.

암호 토큰 요청을 사용하는 경우 클라이언트는 인증을 위해 서비스 ID의 사용자 이름 및 암호를 OAuth WRAP 프로토콜을 통해 ACS로 직접 전송할 수 있습니다. 이는 OAuth WRAP 프로토콜을 사용하여 ACS에서 토큰을 요청하는 가장 간단한 방법입니다. 이 접근 방식에는 SSL 연결 설정 외에 필요한 암호화 기능은 없습니다. 실제로는 REST 웹 서비스에서 널리 사용되는 사용자 이름/암호 모델과 유사합니다. 이 유형의 토큰 요청은 실제로 HTTPS 양식 POST입니다. 암호 토큰 요청의 매개 변수는 양식 인코딩됩니다.

다음은 "mysnservice"라는 네임스페이스에 대한 일반 텍스트 요청을 추적하는 예제입니다.

POST /WRAPv0.9/ HTTP/1.1
Host: mysnservice.accesscontrol.windows.net
Content-Type: application/x-www-form-urlencoded

wrap_scope=http%3A%2F%2Fmysnservice.com%2Fservices%2F&
wrap_name=mysncustomer1&
wrap_password=5znwNTZDYC39dqhFOTDtnaikd1hiuRa4XaAj3Y9kJhQ%3D

아래 표에는 암호 토큰 요청에 제공해야 하는 매개 변수의 이름, 설명 및 값 요구 사항이 나와 있습니다.

 

매개 변수 이름 설명 값 요구 사항

wrap_scope

규칙 집합에 대해 토큰 요청을 일치시킵니다. 이 매개 변수 값을 신뢰 당사자 응용 프로그램 영역 값으로 설정합니다. ACS 관리 포털의 신뢰 당사자 응용 프로그램 페이지에서 적절한 신뢰 당사자 응용 프로그램을 선택하여 영역 필드에서 이 값을 가져올 수 있습니다.

  • HTTP 또는 HTTP(s) URI

  • 쿼리 매개 변수 또는 앵커 없음

  • 경로 세그먼트 <= 32

  • 최대 길이: 256자

  • URL로 인코딩되어야 함

wrap_name

다음 매개 변수의 키에 대한 유효성을 검사합니다. 이 매개 변수의 값을 액세스 제어 네임스페이스 내의 서비스 ID 이름으로 설정합니다. ACS 관리 포털의 서비스 ID 페이지에서 적절한 서비스 ID를 선택하여 이름 필드에서 이 값을 가져올 수 있습니다.

  • 최소 길이: 1자

  • 최대 길이: 128자

  • URL로 인코딩되어야 함

wrap_password

들어오는 요청을 인증합니다. 이 매개 변수의 값을 액세스 제어 네임스페이스 내의 서비스 ID 암호로 설정합니다. ACS 관리 포털의 서비스 ID 페이지에서 적절한 서비스 ID를 선택한 다음 서비스 ID 편집 페이지의 자격 증명 테이블에서 적절한 암호를 선택하여 자격 증명 편집 페이지의 암호 필드에서 이 값을 가져올 수 있습니다.

  • 문자열, 최소 길이 1자, 최대 길이 64자

  • URL로 인코딩되어야 함

ACS로 요청을 보내기 전에 이 매개 변수의 값을 URL로 인코딩해야 합니다. 웹 응용 프로그램 또는 서비스에서 클라이언트에 wrap_scope 값을 제공하거나, 클라이언트에서 wrap_scope 매개 변수의 값을 웹 응용 프로그램 또는 서비스 리소스 대상의 URI로 설정하도록 결정할 수 있습니다.

또한 OAuth WRAP 프로토콜을 통한 암호 토큰 요청은 ACS에서 출력 클레임 계산 프로세스 중에 사용할 수 있는 추가 매개 변수를 포함할 수 있습니다. 이러한 추가 매개 변수 이름 및 값은 URL로 인코딩되어야 하며, 값을 따옴표로 묶어서는 안 됩니다.

암호 토큰 요청 방법은 를 통해 간단하게 수행됩니다.

WebClient client = new WebClient();
client.BaseAddress = string.Format("https://mysnservice.accesscontrol.windows.net");

NameValueCollection values = new NameValueCollection();
values.Add("wrap_name", "mysncustomer1");
values.Add("wrap_password", "5znwNTZDYC39dqhFOTDtnaikd1hiuRa4XaAj3Y9kJhQ=");
values.Add("wrap_scope", "http://mysnservice.com/services");

// WebClient takes care of the URL Encoding
byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values);

// the raw response from ACS
string response = Encoding.UTF8.GetString(responseBytes);

ACS에서 받은 출력 토큰의 압축을 풀고 웹 응용 프로그램 또는 서비스로 보내는 방법에 대한 자세한 내용은 Unwrapping and sending the token to a web application or service를 참조하세요.

대칭 키로 서명된 SWT 토큰을 사용하여 OAuth WRAP 프로토콜을 통해 ACS에서 토큰을 요청할 수도 있습니다. 모든 SWT 토큰 요청은 HTTPS 양식 POST를 통해 이루어집니다. 이 토큰 요청 방법의 매개 변수 값은 양식 인코딩됩니다.

다음은 "mysnservice"라는 네임스페이스에 대한 SWT 토큰 요청을 추적하는 예제입니다.

POST /WRAPv0.9/ HTTP/1.1
Host: mysnservice.accesscontrol.windows.net
Content-Type: application/x-www-form-urlencoded

wrap_scope=http%3A%2F%2Fmysnservice.com%2Fservices%2F&
wrap_assertion_format=SWT&
wrap_assertion=Issuer%3dmysncustomer1%26HMACSHA256%3db%252f%252bJFwbngGdufECFjQb8qhb9YH0e32Cf9ABMDZFiPPA%253d

SWT 토큰 요청에는 다음 매개 변수 및 값이 있어야 합니다.

 

매개 변수 이름 설명 값 요구 사항

wrap_scope

규칙 집합에 대해 토큰 요청을 일치시킵니다.

  • 이 매개 변수 값을 신뢰 당사자 응용 프로그램 영역 값으로 설정합니다. ACS 관리 포털의 신뢰 당사자 응용 프로그램 페이지에서 적절한 신뢰 당사자 응용 프로그램을 선택하여 영역 필드에서 이 값을 가져올 수 있습니다.

  • HTTP 또는 HTTP(s) URI

  • 쿼리 매개 변수 또는 앵커 없음

  • 경로 세그먼트 <= 32

  • 최대 길이: 256자

  • URL로 인코딩되어야 함

wrap_assertion

ACS로 전송되는 입력 토큰입니다.

  • Issuer 및 HMACSHA256 매개 변수를 포함하는 입력 클레임이 있는 서명된 SWT 토큰입니다.

  • 최대 길이: 2048자

  • URL로 인코딩되어야 함

wrap_assertion_format

ACS로 전송되는 입력 토큰의 형식입니다.

SWT

다음 예제에 표시된 대로 SWT 토큰을 요청하는 데 필요한 코드는 암호 토큰을 요청하는 데 필요한 코드와 유사합니다.

WebClient client = new WebClient();
client.BaseAddress = string.Format("https://mysnservice.accesscontrol.windows.net");

NameValueCollection values = new NameValueCollection();
// add the wrap_scope
values.Add("wrap_scope", "http://mysnservice.com/services");
// add the format
values.Add("wrap_assertion_format", "SWT");
// add the SWT
values.Add("wrap_assertion", "Issuer=mysncustomer1&HMACSHA256=b%2f%2bJFwbngGdufECFjQb8qhb9YH0e32Cf9ABMDZFiPPA%3d");
// WebClient takes care of the remaining URL Encoding
byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values);

// the raw response from ACS
string response = Encoding.UTF8.GetString(responseBytes);

ACS에서 받은 응답의 압축을 풀고 웹 응용 프로그램 또는 서비스로 보내는 방법에 대한 자세한 내용은 Unwrapping and sending the token to a web application or service를 참조하세요.

SWT 토큰은 발급자 키(대칭 키)로 서명된 키/값 쌍 집합입니다. SWT 토큰 요청에서 ACS로 전송되는 SWT 토큰은 IssuerHMACSHA256 매개 변수와 ExpiresOn, Audience, 기타 클라이언트 관련 클레임 등의 추가 매개 변수를 포함해야 합니다. 다음 표에는 SWT 토큰 매개 변수의 이름 및 설명이 나와 있습니다.

 

매개 변수 이름 설명

Issuer

ACS에서 토큰에 서명하는 데 사용된 키를 조회합니다. 서명이 유효한 경우 이 값을 사용하여 출력 클레임 계산을 수행합니다.

이 매개 변수를 액세스 제어 네임스페이스 내의 ID 공급자 영역 값 또는 액세스 제어 네임스페이스 내의 서비스 ID 이름으로 설정할 수 있습니다. ACS 관리 포털의 ID 공급자 페이지에서 적절한 ID 공급자를 선택하여 ID 공급자 편집 페이지의 영역 필드에서 이 값을 가져올 수 있습니다. 또는 ACS 관리 서비스를 통해 이 값을 가져올 수 있습니다. 이는 각 ID 공급자에 대해 생성된 "Issuer" 레코드의 이름 속성입니다.

HMACSHA256

ACS에서 SWT 서명의 유효성을 검사하고 Issuer 매개 변수에 이름이 지정된 발급자 키를 조회합니다.

SWT 서명은 액세스 제어 네임스페이스 내의 서비스 ID 또는 ID 공급자에 연결된 대칭 서명 키를 통해 만들어집니다.

사용자

있는 경우 ACS에서는 이 값을 사용하여 ACS가 SWT 토큰의 의도된 대상인지 확인합니다. 이는 액세스 제어 네임스페이스의 URL입니다(예: https://contoso.accesscontrol.windows.net/)

ExpiresOn

있는 경우(Epoch 시간) 토큰이 만료되는 시점을 나타냅니다. 예를 들어 이 매개 변수의 값은 1324300962일 수 있습니다.

추가 클레임

있는 경우 ACS에서는 이러한 매개 변수를 사용하여 출력 클레임 계산을 수행합니다. 각 클레임 유형은 한 번만 나타나야 합니다. 클레임 유형이 같은 여러 클레임 값은 쉼표(",")로 연결해야 합니다. ACS에서 클레임을 어설션하는 방법에 대한 자세한 내용은 OAuth WRAP 프로토콜을 통한 클레임 어설션을 참조하세요.

다음 코드 예제에서는 를 사용하여 SWT 토큰을 생성하는 방법을 보여 줍니다. 여기에는 IssuerHMACSHA256 매개 변수가 포함된 SWT 토큰을 빌드하는 유형이 포함되어 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;

public class TokenFactory
{
    string signingKey;   
    string issuer;
    
    public TokenFactory(string issuer, string signingKey)
    {
        this.issuer = issuer;
        this.signingKey = signingKey;
    }

    public string CreateToken()
    {
        StringBuilder builder = new StringBuilder();

        // add the issuer name
        builder.Append("Issuer=");
        builder.Append(HttpUtility.UrlEncode(this.issuer));

        string signature = this.GenerateSignature(builder.ToString(), this.signingKey);
        builder.Append("&HMACSHA256=");
        builder.Append(signature);

        return builder.ToString();
    }

   
    private string GenerateSignature(string unsignedToken, string signingKey)
    {
        HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(signingKey));

        byte[] locallyGeneratedSignatureInBytes = hmac.ComputeHash(Encoding.ASCII.GetBytes(unsignedToken));

        string locallyGeneratedSignature = HttpUtility.UrlEncode(Convert.ToBase64String(locallyGeneratedSignatureInBytes));

        return locallyGeneratedSignature;
    }
}

SAML 토큰 요청 방법은 주로 AD FS 2.0 통합에 사용되며, 클라이언트에서 엔터프라이즈 ID(Active Directory)를 사용하여 ACS에 인증할 수 있도록 합니다. SAML 토큰 요청 방법을 사용하면 AD FS 2.0에서 발급한 서명된 SAML 1.1 또는 SAML 2.0 토큰(입력 토큰)을 OAuth WRAP 프로토콜을 통해 ACS로 보낼 수 있습니다.

ACS에서는 해당 규칙을 사용하여 출력 클레임을 계산하고 SWT 토큰(출력 토큰)으로 그룹화한 다음 이에 서명하여 OAuth WRAP 프로토콜을 통해 클라이언트로 반환합니다.

SAML 토큰 요청에는 다음 매개 변수 및 값이 있어야 합니다.

 

매개 변수 이름 설명 값 요구 사항

wrap_scope

규칙 집합에 대해 토큰 요청을 일치시킵니다.

  • 이 매개 변수 값을 신뢰 당사자 응용 프로그램 영역 값으로 설정합니다. ACS 관리 포털의 신뢰 당사자 응용 프로그램 페이지에서 적절한 신뢰 당사자 응용 프로그램을 선택하여 영역 필드에서 이 값을 가져올 수 있습니다.

  • HTTP 또는 HTTP(s) URI

  • 쿼리 매개 변수 또는 앵커 없음

  • 경로 세그먼트 <= 32

  • 최대 길이: 256자

  • URL로 인코딩되어야 함

wrap_assertion

ACS로 전송되는 입력 토큰입니다.

  • 입력 클레임이 있는 서명된 SAML 1.1 또는 2.0 토큰입니다. 토큰 제한 사항으로, SAML 1.1 토큰에는 하나 이상의 입력 클레임이 필요합니다. 즉, SAML 1.1 토큰 인증에는 ID 공급자 또는 클레임 사용 서비스 ID를 사용해야 합니다. SAML 2.0 토큰에는 암시적 NameIdentifier 클레임 외에 서비스 ID를 인증하는 데 별도의 입력 클레임이 필요하지 않습니다. 따라서 SAML 2.0 토큰은 클레임을 사용하지 않는 일반 서비스 ID를 인증하는 데 사용될 수 있습니다.

  • URL로 인코딩되어야 함

wrap_assertion_format

ACS로 전송되는 입력 토큰의 형식입니다.

SAML

다음은 SAML 토큰을 요청하는 데 필요한 코드 예제입니다.

private static string SendSAMLTokenToACS(string samlToken)
{
 try
 {
  WebClient client = new WebClient();
  client.BaseAddress = string.Format("https://mysnservice.accesscontrol.windows.net");
  NameValueCollection parameters = new NameValueCollection();
  parameters.Add("wrap_assertion_format", "SAML");
  parameters.Add("wrap_assertion", samlToken);
  parameters.Add("wrap_scope", "http://mysnservice.com/services");

  byte[] responseBytes = client.UploadValues("WRAPv0.9", parameters);
  string response = Encoding.UTF8.GetString(responseBytes);

  return response
   .Split('&')
   .Single(value => value.StartsWith("wrap_access_token=", StringComparison.OrdinalIgnoreCase))
   .Split('=')[1];
 }
 catch (WebException wex)
 {
  string value = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd();
  throw;
 }
}  

ACS에서 받은 응답의 압축을 풀고 웹 응용 프로그램 또는 서비스로 보내는 방법에 대한 자세한 내용은 토큰의 압축을 풀고 웹 응용 프로그램 또는 서비스로 보내기를 참조하세요.

ACS 1.0 토큰 요청 동작과의 이전 버전 호환성을 지원하기 위해 ACS에서는 토큰 요청의 일부로 클레임을 어설션할 수 있는 기능을 지원합니다.

클레임을 어설션하는 데 권장되는 방법은 어설션 응용 프로그램 또는 서비스를 ACS ID 공급자로 등록하는 것입니다. 그러면 응용 프로그램 또는 서비스가 어설션하려는 클레임이 포함된 SAML 또는 SWT 토큰을 제공하여 ACS에서 토큰을 요청하며, 이 토큰은 ACS에 저장된 ID 공급자 키를 사용하여 서명됩니다. 예를 들어 AD FS 2.0 또는 기타 WIF(Windows Identity Foundation)를 사용하여 빌드되고 ACS에 WS-Federation ID 공급자로 등록된 모든 사용자 지정 STS(보안 토큰 서비스)에서 어설션된 클레임이 있는 SAML 토큰 요청을 OAuth WRAP 프로토콜을 통해 ACS로 보낼 수 있습니다.

ACS 관리 포털에서 WS-Federation 메타데이터를 사용하여 ID 공급자를 등록하거나 ACS 관리 서비스를 사용하여 ID 공급자, 주소 및 키를 개별적으로 설정할 수 있습니다. 예제는 방법: ACS 관리 서비스를 사용하여 AD FS 2.0을 엔터프라이즈 ID 공급자로 구성을 참조하세요. 토큰 요청에서 클레임을 어설션하는 이 방법에는 서비스 ID가 필요 없습니다. 이 방법은 모든 ACS 지원 프로토콜을 통해 작동합니다.

토큰 요청이 성공적으로 인증되면 ACS에서 양식 인코딩된 매개 변수 두 개, 즉 wrap_tokenwrap_token_expires_in을 반환합니다. 이러한 매개 변수의 값은 각각 클라이언트에서 웹 응용 프로그램 또는 서비스에 대한 액세스 권한을 얻는 데 사용할 수 있는 실제 SWT 토큰과 이 토큰의 남은 수명(초)입니다.

SWT 토큰을 웹 응용 프로그램 또는 서비스로 보내기 전에 클라이언트는 ACS 응답에서 토큰의 압축을 풀고 URL로 인코딩해야 합니다. 웹 응용 프로그램 또는 서비스에서 HTTP Authorization 헤더에 토큰을 제공하도록 요구하는 경우 토큰 앞에 WRAPv0.9 스키마를 추가해야 합니다.

다음 코드 예제에서는 토큰의 압축을 풀고 Authorization 헤더의 형식을 지정하는 방법을 보여 줍니다.

WebClient client = new WebClient();
client.BaseAddress = string.Format("https://mysnservice.accesscontrol.windows.net");

NameValueCollection values = new NameValueCollection();
values.Add("wrap_name", "mysncustomer1");
values.Add("wrap_password", "5znwNTZDYC39dqhFOTDtnaikd1hiuRa4XaAj3Y9kJhQ=");
values.Add("wrap_scope", "http://mysnservice.com/services");

// WebClient takes care of the URL Encoding
byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values);

// the raw response from ACS
string response = Encoding.UTF8.GetString(responseBytes);

string token = response
    .Split('&')
    .Single(value => value.StartsWith("wrap_token=", StringComparison.OrdinalIgnoreCase))
    .Split('=')[1];

string.Format("WRAP access_token=\"{0}\"", HttpUtility.UrlDecode(token));

ACS에서는 토큰 요청을 충족할 수 없는 경우 오류를 반환합니다. REST 디자인에 따라 오류에는 HTTP 응답 코드가 포함됩니다. 대부분의 경우 ACS 오류에는 발생한 오류에 대한 컨텍스트를 제공하는 SubCodeDetail도 포함됩니다. 오류 형식은 오류:코드:<http 상태>:하위 코드:<코드>:세부 정보:<메시지>입니다. 오류의 Content-Type은 항상 텍스트/일반입니다.

HTTP/1.1 401 Access Forbidden
Content-Type: text/plain; charset=us-ascii

Error:Code:401:SubCode:T0:Detail:ACS50009: SWT token is invalid. :TraceID:<trace id value>:TimeStamp:<timestamp value>

ACS 오류 코드에 대한 자세한 내용은 ACS 오류 코드를 참조하세요.

ACS에서 반환된 오류를 디버깅하거나 복구할 때 응답 본문을 읽어야 하는 경우가 많습니다. 다음 코드 예제에서는 WebException 개체에서 오류 메시지를 읽는 방법을 보여 줍니다.

try
{
    WebClient client = new WebClient();
    client.BaseAddress = string.Format("https://mysnservice.accesscontrol.windows.net");

    NameValueCollection values = new NameValueCollection();
    values.Add("wrap_name", "mysncustomer1");
    values.Add("wrap_password", "5znwNTZDYC39dqhFOTDtnaikd1hiuRa4XaAj3Y9kJhQ=");
    values.Add("wrap_scope", "http://mysnservice.com/services");

    // WebClient takes care of the URL Encoding
    byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values);

    // the raw response from ACS
    string response = Encoding.UTF8.GetString(responseBytes);

    string token = response
        .Split('&')
        .Single(value => value.StartsWith("wrap_access_token=",       StringComparison.OrdinalIgnoreCase))
        .Split('=')[1];
}
catch (WebException wex)
{
    if (wex.Response != null)
    {
        // the response Stream contains the error message
        StreamReader reader = new StreamReader(wex.Response.GetResponseStream());
        string message = reader.ReadToEnd();
    }
    // Throw as appropriate
}

참고 항목

개념

ACS 방법

커뮤니티 추가 항목

추가
표시:
© 2015 Microsoft