ユーザーが 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]
ボタンを送信に戻すと、それが渡されたように見えますが、画像ではなく恐ろしいボタンは本当に必要ありません。