0

ユーザーが Facebook、Twitter、Google、または Microsoft アカウントを使用して MVC4 サイトにログインできるようにしようとしています。ページは正常に読み込まれますが、ボタンの 1 つをクリックしてこれらのサービスのいずれかで認証すると、エラーが発生します。

System.ArgumentNullException: 値を null にすることはできません。

Providerがnullであるため、エラーはアカウントコントローラーのこのコード行を参照しています

OAuthWebSecurity.RequestAuthentication(Provider, ReturnUrl);

このコード行は、このコントローラー アクションに属します

    internal class ExternalLoginResult : ActionResult
    {
        public ExternalLoginResult(string provider, string returnUrl)
        {
            Provider = provider;
            ReturnUrl = returnUrl;
        }

        public string Provider { get; private set; }
        public string ReturnUrl { get; private set; }

        public override void ExecuteResult(ControllerContext context)
        {
            OAuthWebSecurity.RequestAuthentication(Provider, ReturnUrl);
        }
    }

ページが読み込まれると、各ボタンの値が期待どおりに設定されます。コンパイルされたページのページ ソースには、名前と値のセットが表示されます。この例では、twitter の場合

    <div class="authprovider">
        <input type="image" name="Provider" value="twitter" alt="Sign in using Twitter" src="/Images/twitter.png" title="Twitter" />
    </div>

RegisterAuth()AuthConfig ファイルの下で、twitter セクションは次のようになります。

OAuthWebSecurity.RegisterTwitterClient(
    consumerKey: "*Hidden*",
    consumerSecret: "*Hidden*",
    displayName:"Twitter",
    extraData:new Dictionary<string, object>{{"Icon","/Images/twitter.png"}});

_ExternalLoginsListPartial という部分ビューでは、ボタンを出力するためのコードは次のようになります。

    @foreach (AuthenticationClientData p in Model)
    {
        <div class="authprovider">
            <input type="image" name="Provider" value="@p.AuthenticationClient.ProviderName" alt="Sign in using @p.DisplayName" src="@p.ExtraData["Icon"].ToString()" title="@p.DisplayName" />
        </div>

    }

image画像ボタンを許可するように入力タイプを変更しました。デフォルトでは、タイプsubmitです。このエラーは、4 つの外部ログイン オプションすべてで発生します。他の誰かがそれに出くわしたことを願って、これまで頭を悩ませてきました。

[編集 15:41]

ボタンを送信に戻すと、それが渡されたように見えますが、画像ではなく恐ろしいボタンは本当に必要ありません。

4

1 に答える 1