2012-12-02 77 views
2

我有一個使用聲明的Azure ACS和.net 4.5設置的應用程序。我的應用程序也使用Dropbox。我想知道我是否可以讓用戶單獨使用Dropbox識別他們。使用WIF在Asp.Net 4.5上進行自定義身份驗證

當用戶使用dropbox和唯一的ID登錄時,我從dropbox獲取令牌。在.net管道中,我是否告訴它我已經驗證了一個用戶,這樣的主體也在下一個請求中設置。

爲了讓這個例子變得簡單,可以說我有一個帶兩個輸入的表單。命名,通過。如果名稱是1234,傳遞是1234.那麼我想告訴asp.net管道,用戶是通過身份驗證的。這可能嗎?還是我需要創建一個自定義的令牌處理程序來將它整合到WIF中?

更新

我發現這一點:我想在解決方案的意見,如果有安全問題我應該知道了。

 var sam = FederatedAuthentication.SessionAuthenticationModule; 
     if (sam != null) 
     { 
      var cp = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim> {new Claim("Provider","Dropbox")}, "OAuth")); 
      var transformer = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager; 
      if (transformer != null) 
      { 
       cp = transformer.Authenticate(String.Empty, cp); 
      } 
      var token = new SessionSecurityToken(cp); 
      sam.WriteSessionTokenToCookie(token); 
     } 

所有代碼:

public HttpResponseMessage get_reply_from_dropbox(string reply_from) 
{ 
    var response = this.Request.CreateResponse(HttpStatusCode.Redirect); 
    var q = this.Request.GetQueryNameValuePairs(); 
    var uid = q.FirstOrDefault(k => k.Key == "uid"); 
    if (!string.IsNullOrEmpty(uid.Value)) 
    { 
     var sam = FederatedAuthentication.SessionAuthenticationModule; 
     if (sam != null) 
     { 
      var cp = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim> {new Claim("Provider","Dropbox")}, "OAuth")); 
      var transformer = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager; 
      if (transformer != null) 
      { 
       cp = transformer.Authenticate(String.Empty, cp); 
      } 
      var token = new SessionSecurityToken(cp); 
      sam.WriteSessionTokenToCookie(token); 
     } 
    } 

    response.Headers.Location = new Uri(reply_from); 
    return response; 
} 
public async Task<string> get_request_token_url(string reply_to) 
{ 

    var client = new HttpClient(); 
    client.DefaultRequestHeaders.Authorization = 
     new AuthenticationHeaderValue("OAuth", 
      string.Format("oauth_version=\"1.0\", oauth_signature_method=\"PLAINTEXT\", oauth_consumer_key=\"{0}\", oauth_signature=\"{1}&\"", 
      "<dropboxkey>","<dropboxsecret>")); 
    var data = await client.GetStringAsync("https://api.dropbox.com/1/oauth/request_token"); 

    var pars = data.Split('&').ToDictionary(k=>k.Substring(0,k.IndexOf('=')),v=>v.Substring(v.IndexOf('=')+1)); 

    return "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + pars["oauth_token"] 
     + "&oauth_callback=<MYSITE>/api/dropbox/get_reply_from_dropbox?reply_from=" + reply_to; 


} 

它的工作原理是將用戶請求認證URL,當用戶驗證我的應用程序返回到get_reply_from_dropbox和日誌的用戶。

我也需要處理一些其他的東西,比如如果請求不是來自保管箱的話。

回答

1

我爲我的網站使用WIF 3.5(不完全一樣),但它確實使用了ACS +表單auth + OAuth,基本上它使用表單認證(您可以完全控制)或使用ACS/OAuth和將帳戶鏈接在一起,或者直接使用ACS/OAuth。

儘管如此,您將不得不處理註銷。

http://garvincasimir.wordpress.com/2012/04/05/tutorial-mvc-application-using-azure-acs-and-forms-authentication-part-1/

的Dropbox使用OAuth,所以我會走這條路,然後,如果你想「關聯帳戶」創建鏈接到保管箱的Oauth帳戶窗體身份驗證用戶/密碼。用戶不一定要知道正在使用什麼授權約定。 ASP.NET MVC 4具有在默認項目中構建的OAuth /窗體身份驗證。

+0

感謝您的意見。我發現一些使用FederatedAuthentication登錄用戶的代碼。我會把它附加到我的問題上,現在給你一個+1。將它放置一兩天,看看是否有人對我找到的解決方案有一些評論(我不是安全專家)。 –

相關問題