10

OpenID がやや巨大で、通常の登録フォームよりも複雑であることは認識していますが、ここで何かが欠けているように感じます。

この質問によると、プロバイダーから提供された一意の識別子キーを保存することになっています。

プロバイダーは、各ユーザーに一意の ID を提供します。これを保存する必要があります。これは、ログインしたばかりのユーザーをデータベース内のレコードと照合する方法です。

私のコード (MVC 部分から取得)では、この一意の ID はLogOn()アクション メソッドのスイッチ内で指定されます。

public ActionResult LogOn()
{
    var openid = new OpenIdRelyingParty();
    IAuthenticationResponse response = openid.GetResponse();

    if (response != null)
    {
        switch (response.Status)
        {
            case AuthenticationStatus.Authenticated:
                FormsAuthentication.RedirectFromLoginPage(
                    response.ClaimedIdentifier, false);  // <-------- ID HERE! "response.ClaimedIdentifier"
                break;
            case AuthenticationStatus.Canceled:
                ModelState.AddModelError("loginIdentifier",
                    "Login was cancelled at the provider");
                break;
            case AuthenticationStatus.Failed:
                ModelState.AddModelError("loginIdentifier",
                    "Login failed using the provided OpenID identifier");
                break;
        }
    }

    return View();
}

[HttpPost]
public ActionResult LogOn(string loginIdentifier)
{
    if (!Identifier.IsValid(loginIdentifier))
    {
        ModelState.AddModelError("loginIdentifier",
                    "The specified login identifier is invalid");
        return View();
    }
    else
    {
        var openid = new OpenIdRelyingParty();
        IAuthenticationRequest request = openid.CreateRequest(Identifier.Parse(loginIdentifier));

        // Require some additional data
        request.AddExtension(new ClaimsRequest
        {
            BirthDate = DemandLevel.NoRequest,
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require
        });

        return request.RedirectingResponse.AsActionResult();
    }
}

にこの識別子を使用しFormsAuthentication.SetAuthCookie(IDHERE, true);ますか?

メール、名前、ニックネームなどのユーザー情報も保存したい場合はどうすればよいですか。依拠当事者からこのデータのコレクションを取得するにはどうすればよいですか? このプロセスが使用しているプロバイダーに依存する場合、Steam OpenID プロバイダーを使用しています。

http://steamcommunity.com/openid http://steamcommunity.com/dev

4

1 に答える 1

1

ログオンに成功すると、受信したデータ (一意の識別子と要求したクレーム) で好きなことを行うことができます。

  1. 収集したデータをデータベース レコードに格納します。
  2. Cookie に保存します (サービスがある場合はトークンとして送信するか、RP (Reliant party) で使用します)。
  3. ユニバーサル メンバーシップ プロバイダーまたは単純な Sql プロバイダーと共に使用します。

コントローラーに 2 番目のアクションを含める方法は次のとおりです。

    [AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
    public ActionResult LogOnPostAssertion(string openid_openidAuthData)
    {
        IAuthenticationResponse response;
        if (!string.IsNullOrEmpty(openid_openidAuthData))
        {
            var auth = new Uri(openid_openidAuthData);
            var headers = new WebHeaderCollection();
            foreach (string header in Request.Headers)
            {
                headers[header] = Request.Headers[header];
            }

            // Always say it's a GET since the payload is all in the URL, even the large ones.
            HttpRequestInfo clientResponseInfo = new HttpRequestInfo("GET", auth, auth.PathAndQuery, headers, null);
            response = this.RelyingParty.GetResponse(clientResponseInfo);
        }
        else
        {
            response = this.RelyingParty.GetResponse();
        }
        if (response != null)
        {
            switch (response.Status)
            {
                case AuthenticationStatus.Authenticated:
                    var token = RelyingPartyLogic.User.ProcessUserLogin(response);
                    this.FormsAuth.SignIn(token.ClaimedIdentifier, false);
                    string returnUrl = Request.Form["returnUrl"];
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                case AuthenticationStatus.Canceled:
                    ModelState.AddModelError("OpenID", "It looks like you canceled login at your OpenID Provider.");
                    break;
                case AuthenticationStatus.Failed:
                    ModelState.AddModelError("OpenID", response.Exception.Message);
                    break;
            }
        }

受信したデータでできることに関するその他のヒント: リライアント パーティ データベース (アプリ) の UserLogin テーブルにユーザー ログイン レコードを作成する。ユーザーが次にアプリにアクセスしたときに、ユーザーの認証とステータスを検証できます。初めて彼を特定のページにリダイレクトして、OPenID プロバイダーが提供しなかったより具体的なデータ (年齢や性別など) を収集することもできます。すべてのユーザー ログイン (OpenID (steam)、google、liveID) を追跡し、それらをユーザーにリンクできます。これにより、一意のユーザーは、好きな認証プロバイダーでログインできるようになります。

Open ID オーセンティケーターを使用した完全な例については 、前の例を抽出したMVC2 プロジェクト1の OpenId を参照してください。

于 2013-10-03T14:52:15.660 に答える