7

この質問の続きとして、dotnetopenauthで発生している問題があります。

基本的に、RPで指定されたレルムはアプリケーションの実際のベースURLである必要があるのでしょうか。つまり、(http://localhost:1903)?既存のアーキテクチャを使用すると、リダイレクトを削除するのは困難です。レルムをベースのOpenIdコントローラー(http://localhost:1903/OpenId)に設定してみましたが、手動でテストするとXRDSドキュメントが生成されました。ただし、アプリケーションがフリーズしているようで、EPログに次のエラーが表示されます。

2012-10-10 15:17:46,000 (GMT-4) [24] ERROR DotNetOpenAuth.OpenId - Attribute Exchange extension did not provide any aliases in the if_available or required lists.

コード:

依拠当事者:

public ActionResult Authenticate(string RuserName = "")
{
UriBuilder returnToBuilder = new UriBuilder(Request.Url);
returnToBuilder.Path = "/OpenId/Authenticate";
returnToBuilder.Query = null;
returnToBuilder.Fragment = null;

Uri returnTo = returnToBuilder.Uri;
returnToBuilder.Path = "/";
Realm realm = returnToBuilder.Uri;

var response = openid.GetResponse();

if (response == null) {
    if (Request.QueryString["ReturnUrl"] != null && User.Identity.IsAuthenticated) {

    } else {

    string strIdentifier = "http://localhost:3314/User/Identity/" + RuserName;
    var request = openid.CreateRequest(
        strIdentifier,
        realm,
        returnTo);

    var fetchRequest = new FetchRequest();
    request.AddExtension(fetchRequest);
    request.RedirectToProvider();
    }
} else {
    switch (response.Status) {
        case AuthenticationStatus.Canceled:
            break;
        case AuthenticationStatus.Failed:
            break;
        case AuthenticationStatus.Authenticated:
            //log the user in
            break;
    }
}

return new EmptyResult();

}

プロバイダー:

public ActionResult Index()
{
    IRequest request = OpenIdProvider.GetRequest();

    if (request != null) {
        if (request.IsResponseReady) {
            return OpenIdProvider.PrepareResponse(request).AsActionResult();
        }

        ProviderEndpoint.PendingRequest = (IHostProcessedRequest)request;
        return this.ProcessAuthRequest();
    } else {
        //user stumbled on openid endpoint - 404 maybe?
        return new EmptyResult();
    }
 }

public ActionResult ProcessAuthRequest()
    {
        if (ProviderEndpoint.PendingRequest == null) {
            //there is no pending request
            return new EmptyResult();
        }

        ActionResult response;
        if (this.AutoRespondIfPossible(out response)) {
            return response;
        }

        if (ProviderEndpoint.PendingRequest.Immediate) {
            return this.SendAssertion();
        }

        return new EmptyResult();
    }
4

1 に答える 1

11

あなたの質問に対する答えは「いいえ」です。レルムは、サイトのベースURLとreturn_toURLの間の任意のURLにすることができます。したがって、たとえば、return_to URLがhttp://localhost:1903/OpenId/Authenticateの場合、以下はすべて有効なレルムです。

  • http://localhost:1903/OpenId/Authenticate
  • http://localhost:1903/OpenId/
  • http://localhost:1903/

上記のreturn_toを考えると、以下は有効なレルムではありません。

  • http://localhost:1903/OpenId/Authenticate/ (余分な末尾のスラッシュ)
  • http://localhost:1903/openid/ (大文字と小文字を区別!)
  • https://localhost:1903/ (スキーム変更)

Googleなどの一部のOpenIDプロバイダーは、正確なレルムURLに基​​づいてユーザーにペアワイズ一意識別子を発行するため、最も安定するように、レルムをWebサイトのベースURLにすることをお勧めします(サイトを再設計しても変更されません)。 。また、HTTPSにすることができる場合は、return_toをHTTPSにすることができ、その方法で少し安全になるため、HTTPSにすることを強くお勧めします(DNSポイズニング攻撃を軽減します)。

ログのエラーの理由は、RPがFetchRequestOpenID認証要求に拡張機能を作成して追加したが、要求している実際の属性でFetchRequestを初期化していないためです。

あなたが提供した情報では、なぜあなたのアプリがフリーズするのかはわかりませんでした。

于 2012-10-11T03:40:44.807 に答える