3

フォーム認証用にasp.netメンバーシップを実装しました。通常、ログインにはユーザー名が使用されますが、これをメールIDでログインするように変更しました。これは正常に機能しています。今、管理者ロールにないユーザーへのアクセスを制限しようとしています。このように書いたフォルダーにweb.configファイルを作成しました。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow roles="Admin" />
      <deny users="*"/>
    </authorization>
  </system.web>
</configuration>

管理者の役割を持っているユーザーがアクセスできない場合でも、これでテストしたとき。彼がリンクをクリックすると、サインアウトします (ユーザーがページにアクセスする権限を持っていないなど)。メニューを表示するために、web.sitemapファイルを使用しています。役割に基づいて正常に機能しています。その特定のフォルダーの下にある web.cofnig ファイルのコードは、MSDNに従って正しいものです。なぜ機能しないのかわかりません。メンバーシップ コントロールのデフォルトのログイン動作を変更した場合、ロールに注意する必要がありますか? 同様の質問が多く、stackoverflow や他のサイトでも見つかりました。しかし、何も私に解決策を与えません。これで何が問題なのですか?処理するカスタム コードを記述する必要がありますか? ユーザーを許可するために、私は以下のように書きました。それは完璧に機能しています

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow users="master@yahoo.com" />
      <deny users="*"/>
    </authorization>
  </system.web>
</configuration>

ロールに対してのみ機能しないのはなぜですか?

4

2 に答える 2

3

RoleProviderメソッドを使用GetRolesForUserして、ユーザーの許可されたロールを取得します。

// Notice that it accept username instead of email
public string[] GetRolesForUser(string username)

あなたの場合、ユーザー名としてRoleProviderパスmaster@yahoo.comします。その結果、master@yahoo.comユーザー テーブルにユーザー名がありません。

ここに解決策があります-

1) この問題を解決する最も簡単な方法は、 MembershipsテーブルのEmail列をUsersテーブルのUserName列にコピーすることです。

RoleProvider2)カスタムおよびオーバーライドメソッドを作成する難しいGetRolesForUser方法。

3) Universal Membership Providerlegacy Membership Providerの代わりに使用する場合は、 aspnet_UsersInRoles_GetRolesForUserを変更できます。

于 2013-04-02T17:46:37.517 に答える
0

私は別のアプローチを使用しました。emailid でのログインを変更していません。メールのみでログインしています。ただし、デフォルトでは、ロール プロバイダーはemailではなくユーザー名で検証するため、問題が発生しています。そのために私は行動を変えました。したがって、ユーザーがログインするたびに、以下のようなログイン制御値を指定していました。login

 string username = Membership.GetUserNameByEmail(Login1.UserName);
 if (username != null)
 {

     isUser = Membership.ValidateUser(username, Login1.Password);
   }
  if (isUser)
  {
     Login1.UserName = username;
      e.Authenticated = true;
   }

ログインページにこのコードを書いています。したがって、ログインが成功すると、それに応じて loginview が更新されます。今では完璧に機能しています。ウィンさんの回答もいいですね。LoginViewユーザー名の代わりに電子メール ID のみを表示する場合は、このメソッドを実装する必要があります。

public string[] GetRolesForUser(string username)

メールでユーザー名を取得するには、次のように記述します

string username = Membership.GetUserNameByEmail(Page.User.Identity.Name)
于 2013-04-03T05:19:22.740 に答える