2012-01-19 5 views
4

В настоящее время я работаю над клиентом WPF, который получает токен SWT от Windows Azure AppFabric ACS. С помощью этого токена я хочу использовать RESTful WCF Service. Я использовал this tutorial, чтобы получить токен SWT, и он отлично работает. С помощью this MSDN tutorial я создал службу RESTful WCF.Проверка SWT-токена REST WCF-служба

Проблема заключается в том, что токен может иметь неправильный формат, поскольку валидатор токена не может его проверить (ошибка в методе IsHMACValid проверки валидатора, swtWithSignatur.Length == 1).

Пример маркеров, с которым я могу связаться с сервером:

{"appliesTo":"http://localhost:7100/Service/Default.aspx","context":null,"created":1326996221,"expires":1326999821,"securityToken":"<?xml version="1.0" encoding="utf-16"?><wsse:BinarySecurityToken wsu:Id="uuid:74ba5667-04ea-4074-9544-aaafb570c648" ValueType="http://schemas.xmlsoap.org/ws/2009/11/swt-token-profile-1.0" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">aHR0cCUzYSUyZiUyZnNjaGVtYXMueG1sc29hcC5vcmclMmZ3cyUyZjIwMDUlMmYwNSUyZmlkZW50aXR5JTJmY2xhaW1zJTJmZW1haWxhZGRyZXNzPXBhdHJpY2suZWNrZXIlNDBnbWFpbC5jb20maHR0cCUzYSUyZiUyZnNjaGVtYXMueG1sc29hcC5vcmclMmZ3cyUyZjIwMDUlMmYwNSUyZmlkZW50aXR5JTJmY2xhaW1zJTJmbmFtZT1QYXRyaWNrK0Vja2VyJmh0dHAlM2ElMmYlMmZzY2hlbWFzLnhtbHNvYXAub3JnJTJmd3MlMmYyMDA1JTJmMDUlMmZpZGVudGl0eSUyZmNsYWltcyUyZm5hbWVpZGVudGlmaWVyPWh0dHBzJTNhJTJmJTJmd3d3Lmdvb2dsZS5jb20lMmZhY2NvdW50cyUyZm84JTJmaWQlM2ZpZCUzZEFJdE9hd2xzM1doNlgwRFJ6d1BsdzU2a1R0WURmLVNNaDZxZFJtQSZodHRwJTNhJTJmJTJmc2NoZW1hcy5taWNyb3NvZnQuY29tJTJmYWNjZXNzY29udHJvbHNlcnZpY2UlMmYyMDEwJTJmMDclMmZjbGFpbXMlMmZpZGVudGl0eXByb3ZpZGVyPUdvb2dsZSZBdWRpZW5jZT1odHRwJTNhJTJmJTJmbG9jYWxob3N0JTNhNzEwMCUyZlNlcnZpY2UlMmZEZWZhdWx0LmFzcHgmRXhwaXJlc09uPTEzMjY5OTk4MjEmSXNzdWVyPWh0dHBzJTNhJTJmJTJmZmhiYXlhenVyZW5zLmFjY2Vzc2NvbnRyb2wud2luZG93cy5uZXQlMmYmSE1BQ1NIQTI1Nj1SUnN3OUJTSlc2ZFJ0MjJyNkNkcjZWZHpyJTJicTF6MHlhV0FMNVdlJTJiJTJmV3owJTNk</wsse:BinarySecurityToken>","tokenType":"http://schemas.xmlsoap.org/ws/2009/11/swt-token-profile-1.0"}

В портале управления Windows Azure Я выбрал SWT в качестве маркеров формата для моего полагающейся стороны применения. Согласно первому учебнику формат для токена SWT выглядит хорошо, но валидатор токена не принимает его.

PS: Если кто-то пытается выполнить второй учебник (Как выполнить проверку подлинности службы REST WCF, развернутой в Windows Azure с помощью ACS): Я думаю, что в пункте 11 на шаге 3 есть ошибка, в которой вам необходимо изменить файл web.config (раздел system/webService не существует). Конфигурация должна выглядеть примерно так:

ответ

5

Токен, который я отправил на сервер, имел неправильный формат. Вышеупомянутый токен находится в формате json и содержит «securityToken», который кодируется xml. С HttpUtility.UrlDecode и XMLReader можно получить строку base64. Base64 строка указанных выше маркеров:

aHR0cCUzYSUyZiUyZnNjaGVtYXMueG1sc29hcC5vcmclMmZ3cyUyZjIwMDUlMmYwNSUyZmlkZW50aXR5JTJmY2xhaW1zJTJmZW1haWxhZGRyZXNzPXBhdHJpY2suZWNrZXIlNDBnbWFpbC5jb20maHR0cCUzYSUyZiUyZnNjaGVtYXMueG1sc29hcC5vcmclMmZ3cyUyZjIwMDUlMmYwNSUyZmlkZW50aXR5JTJmY2xhaW1zJTJmbmFtZT1QYXRyaWNrK0Vja2VyJmh0dHAlM2ElMmYlMmZzY2hlbWFzLnhtbHNvYXAub3JnJTJmd3MlMmYyMDA1JTJmMDUlMmZpZGVudGl0eSUyZmNsYWltcyUyZm5hbWVpZGVudGlmaWVyPWh0dHBzJTNhJTJmJTJmd3d3Lmdvb2dsZS5jb20lMmZhY2NvdW50cyUyZm84JTJmaWQlM2ZpZCUzZEFJdE9hd2xzM1doNlgwRFJ6d1BsdzU2a1R0WURmLVNNaDZxZFJtQSZodHRwJTNhJTJmJTJmc2NoZW1hcy5taWNyb3NvZnQuY29tJTJmYWNjZXNzY29udHJvbHNlcnZpY2UlMmYyMDEwJTJmMDclMmZjbGFpbXMlMmZpZGVudGl0eXByb3ZpZGVyPUdvb2dsZSZBdWRpZW5jZT1odHRwJTNhJTJmJTJmbG9jYWxob3N0JTNhNzEwMCUyZlNlcnZpY2UlMmZEZWZhdWx0LmFzcHgmRXhwaXJlc09uPTEzMjY5OTk4MjEmSXNzdWVyPWh0dHBzJTNhJTJmJTJmZmhiYXlhenVyZW5zLmFjY2Vzc2NvbnRyb2wud2luZG93cy5uZXQlMmYmSE1BQ1NIQTI1Nj1SUnN3OUJTSlc2ZFJ0MjJyNkNkcjZWZHpyJTJicTF6MHlhV0FMNVdlJTJiJTJmV3owJTNk

Я декодируется этой строкой и получил маркер ACS. Этот токен ACS теперь действителен, и моя служба RESTful WCF может использоваться.

Код на стороне сервера не изменился. Это то, что у меня есть на стороне клиента:

// parse the token from the json string, 
var token = JsonNotifyRequestSecurityTokenResponse.FromJson(txtReceivedToken.Text); 
// get the security token and decode it 
string xmlString = HttpUtility.UrlDecode(token.SecurityTokenString); 
// get the base64 string an 
string string64 = ""; 
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString))) { 
    while (xmlReader.Read()) { 
    if (xmlReader.NodeType == XmlNodeType.Text) { // find the first text element, which should be the base64 string 
     string64 = xmlReader.Value; 
     break; 
    } 
    } 
} 
// decode it 
string acsToken = base64Decode(string64); 

// set the header 
string headerValue = string.Format("WRAP access_token=\"{0}\"", acsToken); 
client.Headers.Add("Authorization", headerValue); 
Stream stream = client.OpenRead(@"http://127.0.0.1:81/Service1.svc/users"); 

StreamReader reader = new StreamReader(stream); 
String response = reader.ReadToEnd(); 

Метод base64Decode я «украл» из http://www.vbforums.com/showthread.php?t=287324. JsonNotifyRequestSecurityTokenResponse.FromJson часть, которую я получил от http://www.leastprivilege.com/, но я думаю, что она может быть проанализирована любым доступным парсером JSON.

Я не знаю, если это лучшее решение, но оно работает для меня.

+0

Спасибо, работает на меня :) – Pking

 Смежные вопросы

  • Нет связанных вопросов^_^