2012-03-19 2 views
2

У меня есть приложение Silverlight, которое запрашивает токен SAML от STS, используя реализацию WSTrust из набора для обучения Identity.Как извлечь и проверить токен SAML в заголовке авторизации с помощью веб-API ASP.NET?

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    WSTrustClient wsTrustClient = new WSTrustClient(new WSTrustBindingUsernameMixed(), new EndpointAddress("https://localhost/SecurityTokenService/Service.svc/IWSTrust13"), new UsernameCredentials("user", "password")); 
    wsTrustClient.IssueCompleted += new EventHandler<IssueCompletedEventArgs>(wsTrustClient_IssueCompleted); 

    RequestSecurityToken rst = new RequestSecurityToken() 
    { 
     AppliesTo = new EndpointAddress("https://localhost/SilverlightApplication.Web") 
    }; 

    wsTrustClient.IssueAsync(rst); 
} 

private void wsTrustClient_IssueCompleted(object sender, IssueCompletedEventArgs e) 
{ 
    this.Resources.Add("SamlToken", e.Result); 
    this.RootVisual = new MainPage(); 
} 

Silverlight, приложение затем помещает маркер SAML в авторизации заголовка запроса на мои ASP.NET веб-служб API; опять же, используя ту же самую реализацию WSTrust.

string uri ="https://localhost/WebApi/api/resource"; 
WebRequest request = WebRequest.Create(uri); 
request.Method = "GET"; 

RequestSecurityTokenResponse rstr = (RequestSecurityTokenResponse)Application.Current.Resources["SamlToken"]; 
request.Headers[HttpRequestHeader.Authorization] = "SAML " + rstr.RequestedSecurityToken.RawToken; 

request.BeginGetResponse((result) => 
{ 
    using (WebResponse response = request.EndGetResponse(result)) 
    { 
     // Process Response 
    } 
}, null); 

Во-первых, я собираюсь сделать это правильно? Во-вторых, если да, то каким образом я могу заставить службы ASP.NET Web API обнаруживать токен SAML и преобразовывать его в сервер IClaimsPrincipal?

ответ

2

Не гуру Silverlight, но есть ряд статей (и некоторых пользовательских классов) здесь относительно услуг WebAPI и WIF - ASP.NET WebAPI Security 1: Introducing Thinktecture.IdentityModel.Http.

Это может помочь?

+0

Спасибо. Я потратил много времени на блог Доминика Байера, и он широко использует свою собственную концепцию Thinktecture, но я никогда не мог узнать, как это сделать сам. По крайней мере, теперь я могу проверить его исходный код и посмотреть, что он сделал. –