2012-01-19 76 views
4

我目前正在研究WPF客戶端,它從Windows Azure AppFabric ACS獲取SWT令牌。有了這個令牌,我想要使用RESTful WCF服務。 我使用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令牌的格式看起來不錯,但令牌驗證器不會接受它。如果有人正在嘗試第二個教程(如何:使用ACS對部署到Windows Azure的REST WCF服務進行身份驗證): 我認爲步驟3中的第11點存在錯誤,您必須在其中修改web.config文件(system/webService部分不存在)。配置應該是這個樣子:

<?xml version="1.0"?> 
<configuration> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="SWTModule" type="SecurityModule.SWTModule, SecurityModule" /> 
    </modules> 
    </system.webServer> 
</configuration> 

回答

5

的令牌,我發送到服務器,有錯誤的格式。 上述標記是json格式,包含一個'securityToken',它是xml編碼的。用HttpUtility.UrlDecodeXMLReader可以檢索base64字符串。上述令牌的基於64位字符串是:

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