我有一個使用聲明的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和日誌的用戶。
我也需要處理一些其他的東西,比如如果請求不是來自保管箱的話。
感謝您的意見。我發現一些使用FederatedAuthentication登錄用戶的代碼。我會把它附加到我的問題上,現在給你一個+1。將它放置一兩天,看看是否有人對我找到的解決方案有一些評論(我不是安全專家)。 –