Share via


일반 개념

 

연결 문자열 구문 분석

알림 허브에 액세스 하려면 두 가지 정보가 있어야: 허브 이름 ("a/b/c"와 같은 경로 일 수 있음), 연결 문자열입니다. 허브의 끝점에 대 한 정보를 포함 하는 연결 문자열 및 액세스에 사용할 보안 자격 증명 (SAS의 경우 포함 규칙 이름 및 키 값)입니다.

다음 코드에 관련 정보를 추출 하는 연결 문자열 구문 분석:

public partial class ConnectionStringUtility { public string Endpoint { get; private set; } public string SasKeyName { get; private set; } public string SasKeyValue { get; private set; } public ConnectionStringUtility(string connectionString) { //Parse Connectionstring char[] separator = { ';' }; string[] parts = connectionString.Split(separator); for (int i = 0; i < parts.Length; i++) { if (parts[i].StartsWith("Endpoint")) Endpoint = "https" + parts[i].Substring(11); if (parts[i].StartsWith("SharedAccessKeyName")) SasKeyName = parts[i].Substring(20); if (parts[i].StartsWith("SharedAccessKey")) SasKeyValue = parts[i].Substring(16); } } }  
  
String[] parts = connectionString.split(";"); if (parts.length != 3) throw new RuntimeException("Error parsing connection string: " + connectionString); for (int i = 0; i < parts.length; i++) { if (parts[i].startsWith("Endpoint")) { this.endpoint = "https" + parts[i].substring(11); } else if (parts[i].startsWith("SharedAccessKeyName")) { this.SasKeyName = parts[i].substring(20); } else if (parts[i].startsWith("SharedAccessKey")) { this.SasKeyValue = parts[i].substring(16); } }  
var parts = connectionString.split(';'); if (parts.length != 3) throw "Error parsing connection string"; parts.forEach(function(part) { if (part.indexOf('Endpoint') == 0) { endpoint = 'https' + part.substring(11); } else if (part.indexOf('SharedAccessKeyName') == 0) { sasKeyName = part.substring(20); } else if (part.indexOf('SharedAccessKey') == 0) { sasKeyValue = part.substring(16); } });  

SAS를 만들 보안 토큰

SAS를 사용 하 여 인증을 위해 클라이언트에서 SAS 토큰을 지정 해야는 Authorization 해당 요청 헤더입니다. 토큰은 연결 문자열과 인증 해야 할 현재 요청에서 추출한 정보에서 생성 됩니다. 토큰 형식은 다음과 같습니다.

SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>  

참고 토큰이 참조 하는 keyName (알림을 보내도록 일반적으로 사용 하는 DefaultFullSharedAccessSignature 모든 알림 허브에서 자동으로 생성 되는 속성).

SAS 토큰의 서명을 사용 하 여 서명할 문자열 값의 hmac-sha256를 사용 하 여 계산 되는 PrimaryKey 권한 부여 규칙의 속성입니다. 서명할 문자열 값은 리소스 URI와 같이 서식이 지정 된 expiry로 구성 됩니다.

StringToSign = <resourceURI> + "\n" + expiry;  

참고가이 작업에 대 한 인코딩되지 않은 리소스 URI를 사용 해야 합니다. 리소스 URI는의 전체 URI는 서비스 버스 리소스 액세스를 요청 합니다. 폼은 다음과 같습니다.

http://<namespace>.servicebus.windows.net/<hubName>  

예를 들면 다음과 같습니다.

http://contoso.servicebus.windows.net/myHub  

만료를 1 1970 년 1 월에 epoch 00시: 00 UTC 이후의 초 수로 표시 됩니다.

이 URI로 지정 된 엔터티에 서명에 사용 되는 공유 액세스 권한 부여 규칙을 구성 되어야 합니다. 이 이전 예제에서는 http://contoso.servicebus.windows.net/myHub 또는 http://contoso.servicebus.windows.net합니다.

URL로 인코딩된 resourceURI 서명할 문자열에는 서명 계산 하는 동안 사용 되는 URI와 동일 해야 합니다. % 인코딩된 대 / 소문자 여야 합니다.

다음 코드를 요청 URI, SAS 토큰을 만듭니다. Java 버전에서 Apache Commons Codec을 사용 하 고 Javascript 버전은 cryptojs를 사용 합니다.

public partial class ConnectionStringUtility { public string getSaSToken(string uri, int minUntilExpire) { string targetUri = Uri.EscapeDataString(uri.ToLower()).ToLower(); // Add an expiration in seconds to it. long expiresOnDate = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; expiresOnDate += minUntilExpire * 60 * 1000; long expires_seconds = expiresOnDate / 1000; String toSign = targetUri + "\n" + expires_seconds; // Generate a HMAC-SHA256 hash or the uri and expiration using your secret key. MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256); BinaryStringEncoding encoding = BinaryStringEncoding.Utf8; var messageBuffer = CryptographicBuffer.ConvertStringToBinary(toSign, encoding); IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(SasKeyValue, encoding); CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer); IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer); string signature = Uri.EscapeDataString(CryptographicBuffer.EncodeToBase64String(signedMessage)); return "SharedAccessSignature sr=" + targetUri + "&sig=" + signature + "&se=" + expires_seconds + "&skn=" + SasKeyName; } }  
  
private String generateSasToken(URI uri) { String targetUri; try { targetUri = URLEncoder .encode(uri.toString().toLowerCase(), "UTF-8") .toLowerCase(); long expiresOnDate = System.currentTimeMillis(); int expiresInMins = 60; // 1 hour expiresOnDate += expiresInMins * 60 * 1000; long expires = expiresOnDate / 1000; String toSign = targetUri + "\n" + expires; // Get an hmac_sha1 key from the raw key bytes byte[] keyBytes = SasKeyValue.getBytes("UTF-8"); SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256"); // Get an hmac_sha1 Mac instance and initialize with the signing key Mac mac = Mac.getInstance("HmacSHA256"); mac.init(signingKey); // Compute the hmac on input data bytes byte[] rawHmac = mac.doFinal(toSign.getBytes("UTF-8")); // using Apache commons codec for base64 String signature = URLEncoder.encode( Base64.encodeBase64String(rawHmac), "UTF-8"); // construct authorization string String token = "SharedAccessSignature sr=" + targetUri + "&sig=" + signature + "&se=" + expires + "&skn=" + SasKeyName; return token; } catch (Exception e) { throw new RuntimeException(e); } }  
var getSelfSignedToken = function(targetUri, sharedKey, ruleId, expiresInMins) { targetUri = encodeURIComponent(targetUri.toLowerCase()).toLowerCase(); // Set expiration in seconds var expireOnDate = new Date(); expireOnDate.setMinutes(expireOnDate.getMinutes() + expiresInMins); var expires = Date.UTC(expireOnDate.getUTCFullYear(), expireOnDate .getUTCMonth(), expireOnDate.getUTCDate(), expireOnDate .getUTCHours(), expireOnDate.getUTCMinutes(), expireOnDate .getUTCSeconds()) / 1000; var tosign = targetUri + '\n' + expires; // using CryptoJS var signature = CryptoJS.HmacSHA256(tosign, sharedKey); var base64signature = signature.toString(CryptoJS.enc.Base64); var base64UriEncoded = encodeURIComponent(base64signature); // construct autorization string var token = "SharedAccessSignature sr=" + targetUri + "&sig=" + base64UriEncoded + "&se=" + expires + "&skn=" + ruleId; // console.log("signature:" + token); return token; };