クレームを使用して、Azure ACS と .net 4.5 でアプリケーションをセットアップしています。私のアプリケーションはドロップボックスも使用しています。ユーザーがドロップボックスだけで自分自身を識別できるようにできるかどうか疑問に思っていました。
ユーザーがドロップボックスと一意の ID でログインすると、ドロップボックスからトークンを取得します。.net パイプのどこで、ユーザーを認証したことを伝えますか。そのようなプリンシパルは、次の要求でも設定されます。
例を簡単にするために、2 つの入力を持つフォームがあるとします。名前、パス。名前が 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に戻り、ユーザーにログインします。
リクエストがドロップボックスからのものではない場合など、他のものも処理する必要があるためです。