2

クレームを使用して、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に戻り、ユーザーにログインします。

リクエストがドロップボックスからのものではない場合など、他のものも処理する必要があるためです。

4

1 に答える 1

1

私は自分のサイトで WIF 3.5 を使用してこれを行いましたが (まったく同じではありません)、ACS + フォーム認証 + 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 を使用するため、そのルートに進み、「アカウントをリンク」する場合は、DropBox Oauth アカウントにリンクされたフォーム認証用のユーザー/パスワードを作成します。ユーザーは、どの認証規則が使用されているかを必ずしも知る必要はありません。ASP.NET MVC 4 には、既定のプロジェクトに組み込まれた OAuth/forms 認証があります。

于 2012-12-03T13:40:25.400 に答える