SecurityTokenHandler.WriteToken 메서드

정의

파생 클래스에서 재정의되는 경우 지정한 보안 토큰을 serialize합니다. 토큰은 파생된 클래스에서 처리되는 형식이어야 합니다.

오버로드

WriteToken(SecurityToken)

파생 클래스에서 재정의되는 경우 지정한 보안 토큰을 문자열에 serialize합니다. 토큰은 파생된 클래스에서 처리되는 형식이어야 합니다.

WriteToken(XmlWriter, SecurityToken)

파생 클래스에서 재정의되는 경우 지정한 보안 토큰을 XML에 serialize합니다. 토큰은 파생된 클래스에서 처리되는 형식이어야 합니다.

WriteToken(SecurityToken)

파생 클래스에서 재정의되는 경우 지정한 보안 토큰을 문자열에 serialize합니다. 토큰은 파생된 클래스에서 처리되는 형식이어야 합니다.

public:
 virtual System::String ^ WriteToken(System::IdentityModel::Tokens::SecurityToken ^ token);
public virtual string WriteToken (System.IdentityModel.Tokens.SecurityToken token);
abstract member WriteToken : System.IdentityModel.Tokens.SecurityToken -> string
override this.WriteToken : System.IdentityModel.Tokens.SecurityToken -> string
Public Overridable Function WriteToken (token As SecurityToken) As String

매개 변수

token
SecurityToken

serialize할 토큰입니다.

반환

String

serialize된 토큰입니다.

설명

기본적으로이 메서드에서 throw 한 NotImplementedException 예외입니다.

보안 토큰을 XML로 serialize 하는 논리를 제공 하려면이 메서드를 재정의 합니다. 또한 재정의 해야 하는 경우이 메서드를 재정의 하 여 CanWriteToken 속성입니다.

적용 대상

WriteToken(XmlWriter, SecurityToken)

파생 클래스에서 재정의되는 경우 지정한 보안 토큰을 XML에 serialize합니다. 토큰은 파생된 클래스에서 처리되는 형식이어야 합니다.

public:
 virtual void WriteToken(System::Xml::XmlWriter ^ writer, System::IdentityModel::Tokens::SecurityToken ^ token);
public virtual void WriteToken (System.Xml.XmlWriter writer, System.IdentityModel.Tokens.SecurityToken token);
abstract member WriteToken : System.Xml.XmlWriter * System.IdentityModel.Tokens.SecurityToken -> unit
override this.WriteToken : System.Xml.XmlWriter * System.IdentityModel.Tokens.SecurityToken -> unit
Public Overridable Sub WriteToken (writer As XmlWriter, token As SecurityToken)

매개 변수

writer
XmlWriter

XML 작성기입니다.

token
SecurityToken

serialize할 토큰입니다.

예제

다음 코드를 재정의 하는 방법을 보여 줍니다는 WriteToken 사용자 지정 토큰을 serialize 하는 방법입니다. 코드에서 수행 되는 Custom Token 샘플입니다. 이 샘플의 간단한 웹 토큰 (SWT) 처리를 사용 하도록 설정 하는 사용자 지정 클래스를 제공 합니다. 이 샘플 및 WIF 및 다운로드할 위치에 사용할 수 있는 다른 샘플에 대 한 정보를 참조 하세요 WIF 코드 샘플 인덱스합니다.

/// <summary>
/// Serializes the given SecurityToken to the XmlWriter.
/// </summary>
/// <param name="writer">XmlWriter into which the token is serialized.</param>
/// <param name="token">SecurityToken to be serialized.</param>
public override void WriteToken( XmlWriter writer, SecurityToken token )
{
    SimpleWebToken simpleWebToken = token as SimpleWebToken;
    if ( simpleWebToken == null )
    {
        throw new SecurityTokenException("The given token is not of the expected type 'SimpleWebToken'.");
    }

    string signedToken = null;

    if ( String.IsNullOrEmpty( simpleWebToken.SerializedToken ) )
    {
        StringBuilder strBuilder = new StringBuilder();

        bool skipDelimiter = true;
        NameValueCollection tokenProperties = simpleWebToken.GetAllProperties();

        // remove the signature if present
        if ( String.IsNullOrEmpty( tokenProperties[SimpleWebTokenConstants.Signature] ) )
        {
            tokenProperties.Remove( SimpleWebTokenConstants.Signature );
        }

        foreach ( string key in tokenProperties.Keys )
        {
            if ( tokenProperties[key] != null )
            {
                if ( !skipDelimiter )
                {
                    strBuilder.Append( ParameterSeparator );
                }

                strBuilder.Append( String.Format(
                    CultureInfo.InvariantCulture,
                    "{0}={1}",
                    HttpUtility.UrlEncode( key ),
                    HttpUtility.UrlEncode( tokenProperties[key] ) ) );

                skipDelimiter = false;
            }
        }

        string serializedToken = strBuilder.ToString();

        SimpleWebTokenKeyIdentifierClause clause = new SimpleWebTokenKeyIdentifierClause(simpleWebToken.Audience);
        InMemorySymmetricSecurityKey securityKey = null;
        try
        {
            securityKey = (InMemorySymmetricSecurityKey)this.Configuration.IssuerTokenResolver.ResolveSecurityKey(clause);
        }
        catch (InvalidOperationException)
        {
            throw new SecurityTokenValidationException("A Symmetric key was not found for the given key identifier clause.");
        }
       
        // append the signature
        string signature = GenerateSignature( serializedToken, securityKey.GetSymmetricKey() );
        strBuilder.Append( String.Format(
                    CultureInfo.InvariantCulture,
                    "{0}{1}={2}",
                    ParameterSeparator,
                    HttpUtility.UrlEncode( SimpleWebTokenConstants.Signature ),
                    HttpUtility.UrlEncode( signature ) ) );

        signedToken = strBuilder.ToString();
    }
    else
    {
        // reuse the stored serialized token if present
        signedToken = simpleWebToken.SerializedToken;
    }

    string encodedToken = Convert.ToBase64String( Encoding.UTF8.GetBytes( signedToken ) );
    writer.WriteStartElement(BinarySecurityToken);
    writer.WriteAttributeString("Id", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", token.Id);
    writer.WriteAttributeString( ValueType, SimpleWebTokenConstants.ValueTypeUri );
    writer.WriteAttributeString( EncodingType, Base64EncodingType );
    writer.WriteString( encodedToken );
    writer.WriteEndElement();
}
/// <summary>
/// Generates an HMACSHA256 signature for a given string and key.
/// </summary>
/// <param name="unsignedToken">The token to be signed.</param>
/// <param name="signingKey">The key used to generate the signature.</param>
/// <returns>The generated signature.</returns>
protected static string GenerateSignature(string unsignedToken, byte[] signingKey)
{
    using (HMACSHA256 hmac = new HMACSHA256(signingKey))
    {
        byte[] signatureBytes = hmac.ComputeHash(Encoding.ASCII.GetBytes(unsignedToken));
        string signature = HttpUtility.UrlEncode(Convert.ToBase64String(signatureBytes));

        return signature;
    }
}

설명

기본적으로이 메서드에서 throw 한 NotImplementedException 예외입니다.

보안 토큰을 XML로 serialize 하는 논리를 제공 하려면이 메서드를 재정의 합니다. 또한 재정의 해야 하는 경우이 메서드를 재정의 하 여 CanWriteToken 속성입니다.

적용 대상