11

コードブラインドの瞬間を持っています。

ASP.NET4.0。

Web.config:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name="DataViewer" loginUrl="login.aspx">
        <credentials passwordFormat="Clear">
          <user name="devuser" password="test" />
        </credentials>
      </forms>
    </authentication>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>

およびログインコントロール:

  <asp:Login ID="login" runat="server" />

ユーザー名とパスワードを入力して[ログイン]をクリックすると、ハングします。

壊れた場合、呼び出しlogin.AuthenticateUsingMembershipProvider()の途中にある呼び出しスタックを確認できますSqlMembershipProvider.ValidateUser()。このプロジェクトにはデータベースが定義されておらず、関与していません。また、SqlMembershipProviderを使用するように指定していません。

<credentials>だから私の質問は、ASP.NETにの要素のユーザー名とパスワードを使用させるためにどのメンバーシッププロバイダーを使用する必要があるweb.configかということです。

4

4 に答える 4

16

<credentials />フレームワークの設計者が要素を定義するのに苦労したことを考えると、それを使用するためのコードを実装していなかったことに驚いています。

私はここでこれの一種の実用的な実装を見つけました。これを修正して以下に含めました。MembershipProviderスローの他のすべてのメンバーNotImplementedException

using System.Configuration;
using System.Web.Configuration;
using System.Web.Security;

public class WebConfigMembershipProvider : MembershipProvider
{
    private FormsAuthenticationUserCollection _users = null;
    private FormsAuthPasswordFormat _passwordFormat;

    public override void Initialize(string name,
      System.Collections.Specialized.NameValueCollection config)
    {
        base.Initialize(name, config);
        _passwordFormat = getPasswordFormat();
    }

    public override bool ValidateUser(string username, string password)
    {
        var user = getUsers()[username];
        if (user == null) return false;

        if (_passwordFormat == FormsAuthPasswordFormat.Clear)
        {
            if (user.Password == password)
            {
                return true;
            }
        }
        else
        {
            if (user.Password == FormsAuthentication.HashPasswordForStoringInConfigFile(password,
                _passwordFormat.ToString()))
            {
                return true;
            }
        }

        return false;
    }

    protected FormsAuthenticationUserCollection getUsers()
    {
        if (_users == null)
        {
            AuthenticationSection section = getAuthenticationSection();
            FormsAuthenticationCredentials creds = section.Forms.Credentials;
            _users = section.Forms.Credentials.Users;
        }
        return _users;
    }

    protected AuthenticationSection getAuthenticationSection()
    {
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        return (AuthenticationSection)config.GetSection("system.web/authentication");
    }

    protected FormsAuthPasswordFormat getPasswordFormat()
    {
        return getAuthenticationSection().Forms.Credentials.PasswordFormat;
    }
}
于 2012-09-14T14:07:27.100 に答える
3

このために独自のプロバイダーを作成する必要があります。MSDNドキュメントReadOnlyXmlMembershipProviderのサンプルを取得し、外部XMLファイルではなく、からユーザーとクレデンシャルを読み取るように変更するのは比較的簡単です。web.config

于 2012-09-14T13:59:56.737 に答える
3

試したかどうかはわかりませんが…。

FormsAuthentication.Authenticateがそれを実行します(ただし、推奨される動作はMembershipオブジェクトを使用することであるため、現在は非推奨です)

MSDNから:

Authenticateメソッドは、アプリケーション構成ファイルの資格情報セクションに保存されているユーザー資格情報を確認します。または、ASP.NETメンバーシップを使用してユーザーの資格情報を保存し、ValidateUserを呼び出して資格情報を確認することもできます。

メンバーシッププロバイダーを削除することもできます(web.configで宣言しなくても、machine.configファイルから継承されるため)

  <membership>
    <providers>
      <remove name="AspNetSqlMembershipProvider"/>
    </providers>
  </membership>
于 2012-09-14T14:27:25.320 に答える
-3

この方法を使用してみてください。お役に立てば幸いです。http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.onauthenticate.aspx

于 2012-09-14T13:55:04.710 に答える