3

私は何を持っていますか?

Windows または FBA ログインのいずれかを選択するためのドロップダウン ボックスを備えたすぐに使えるログイン ページを使用して、Web アプリケーションの 1 つで FBA を構成しました。すべてが正常に機能しています。

私は何をしたいですか?

ユーザー名とパスワードのテキスト ボックスと、Windows ユーザーと FBA ユーザーの両方の認証に使用されるログイン ボタンを備えたカスタム ログイン ページが必要です。2 つの異なるログインを区別するために、OnAuthenticate イベントを処理し、ユーザー名に「\」が含まれているかどうかを確認し、それ以外の場合は Windows ユーザーであると想定します。それは FBA ユーザーです。

これは、OnAuthenticate イベント ハンドラーで記述されたコードです。

protected void signinControl_Authenticate(object sender, AuthenticateEventArgs e)
{
    string fullUserName = signinControl.UserName;
    string username = null;

    if (fullUserName.Contains("\\")) //Windows user
    {
        string domain = fullUserName.Substring(0, fullUserName.IndexOf("\\"));
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
        {
            username = fullUserName.Substring(fullUserName.IndexOf("\\") + 1);
            e.Authenticated = pc.ValidateCredentials(username, signinControl.Password);
        }
    }
    else //FBA user
    {
        e.Authenticated = Membership.ValidateUser(fullUserName, signinControl.Password);
    }
}

私はどのような問題に直面していますか?

上記のコードは、FBA ユーザーに適しています。しかし、検証後にe.Authenticatedが設定されていても、Windows ユーザーでログインしようとすると、 true「ログイン試行が成功しませんでした。もう一度やり直してください。」というエラーがスローされます。

e.Authenticated = pc.ValidateCredentials(username, signinControl.Password);

に設定e.Authenticatedするとtrue、ログインページから要求されたページにユーザーがリダイレクトされるはずです。Windows ユーザーをサインインさせるために何か他のことをしなければならない場合、誰か助けてもらえますか?

更新-1 :

メソッドを使用SetAuthCookie()して Cookie を明示的に設定しましたが、結果は同じです。

FormsAuthentication.SetAuthCookie(username, true);
4

1 に答える 1

0

フォームユーザーには以下のメソッドを使用する必要があります

SPClaimsUtility.AuthenticateFormsUser(
                Context.Request.UrlReferrer,
                UserName.Text, 
                Password.Text);

Windows 部分は次のように宣言されます。

protected void lbInternalUsers_OnClick(object sender, EventArgs e)
    {
        try
        {
            if (null != SPContext.Current && null != SPContext.Current.Site)
            {
                SPIisSettings iisSettings = SPContext.Current.Site.WebApplication.IisSettings[SPUrlZone.Default];
                if (null != iisSettings && iisSettings.UseWindowsClaimsAuthenticationProvider)
                {
                    SPAuthenticationProvider provider = iisSettings.WindowsClaimsAuthenticationProvider;
                    Redirect(provider);
                }
            }
        }
        catch (Exception ex)
        {
            lblError.Text = ex.Message;
        }
    }

    private void Redirect(SPAuthenticationProvider provider)
    {
        string comp = HttpContext.Current.Request.Url.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);
        string url = provider.AuthenticationRedirectionUrl.ToString();
        if (provider is SPWindowsAuthenticationProvider)
        {
            comp = EnsureUrl(comp, true);
        }

        SPUtility.Redirect(url, SPRedirectFlags.Default, this.Context, comp);
    }

    private string EnsureUrl(string url, bool urlIsQueryStringOnly)
    {
        if (!url.Contains("ReturnUrl="))
        {
            if (urlIsQueryStringOnly)
            {
                url = url + (string.IsNullOrEmpty(url) ? "" : "&");
            }
            else
            {
                url = url + ((url.IndexOf('?') == -1) ? "?" : "&");
            }
            url = url + "ReturnUrl=";
        }
        return url;
    }

参照でここに詳述されているように

于 2012-03-27T19:22:02.547 に答える