web-dev-qa-db-ja.com

認証モード=フォームを使用したMVC5外部認証

私は このチュートリアル をフォローして、外部認証を使用した単純なMVC5アプリを作成します。正常に動作していますが、authentication mode="None"authentication mode="Forms"に変更すると動作を停止します。

私はnullになっています:

await HttpContext.GetOwinContext().Authentication.GetExternalLoginInfoAsync()

リダイレクト時にFormsAuthenticationを抑制するための何かについてたくさん読んでいます。それが正しいパスかどうかはわかりませんが、これをインストールしようとしました nuget packet そして問題はまだあります。

では、認証モードを変更するたびにnullが発生するのはなぜですか?

10
Felipe Miosso

ChallengeResultクラスにResponse.SuppressFormsAuthenticationRedirect = trueを追加することで、これを機能させることができました(OWINおよびFormsAuthentication)。

チュートリアルに従っている場合、コードは次のとおりです。

public class ChallengeResult : HttpUnauthorizedResult
{
    public ChallengeResult(string provider, string redirectUri)
        : this(provider, redirectUri, null)
    {
    }

    public ChallengeResult(string provider, string redirectUri, string userId)
    {
        LoginProvider = provider;
        RedirectUri = redirectUri;
        UserId = userId;
    }

    public string LoginProvider { get; set; }
    public string RedirectUri { get; set; }
    public string UserId { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        // this line did the trick
        context.RequestContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;

        var properties = new AuthenticationProperties() { RedirectUri = RedirectUri };
        if (UserId != null)
        {
            properties.Dictionary[XsrfKey] = UserId;
        }

        context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
    }
}
20
Felipe Miosso

通常、ユーザーがまったく認証されていない場合、またはカスタム認証コードを開発する場合は、authentication mode="None"を設定します。 MVC 5は、認証にASP.NETIdentityを使用するように更新されました。

ASP.NET Identityは、ユーザーのIDが一連のクレームとして表されるクレームベースの認証をサポートします。ここで、authentication mode="Forms"を設定します。ASP.NET Forms Authenticationはクレームをサポートしていないため、クレームは機能しません。これが、null値を取得する理由です。

2
Lin