私のUserController.Login
アクションでAddUserToRole()
は、ユーザーエンティティのMembershipType.MembershipName
ナビゲーションプロパティのいずれかの値を使用して、認証されたユーザーを取得しようとしています:
Roles.AddUserToRole(thisUser.UserName, thisUser.MembershipType.MembershipName);
私は肥大化した自動生成されたメンバーシップ タイプを使用しておらず、ロールの範囲ではなく、ユーザーのロールにテキスト値を追加したいだけです。ユーザー --> 1 つのロール。
これを理解しようとして、web.config でカスタム ロール プロバイダーを定義しました。
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
<providers>
<clear/>
<add name="CustomRoleProvider"
type="MyWebsite.CustomRoleProvider,
CustomMembershipEF, Version=1.0.0.0, Culture=neutral"
connectionStringName="MyDbContext"
enablePasswordRetrieval="false" enablePasswordReset="true"
requiresQuestionAndAnswer="false" writeExceptionsToEventLog="false" />
</providers>
</roleManager>
Roles.AddUserToRole() を呼び出すと、カスタム プロバイダーのメソッドが呼び出されますが、そのメソッドで何をすべきかわかりません。
以前、web.config のセクションに単純に追加enabled="true"
しましたrolemanager
が、次のエラーが発生していました。
要求された .Net Framework Data Provider が見つかりません。インストールされていない可能性があります。
これが私のカスタム ロール プロバイダーです (ただし、ロール名を追加したいだけなので、これが必要な理由はわかりません)。
public class CustomRoleProvider : RoleProvider
{
public override bool IsUserInRole(string username, string roleName)
{
using (var db = new MyApp.DAL.MyAppDbContext())
{
var user = db.Users.SingleOrDefault(u => u.UserName == username);
if (user == null)
return false;
if (user.MembershipType != null && user.MembershipType.MembershipName == roleName)
{
return true;
}
}
return false;
}
public override string[] GetRolesForUser(string username)
{
using (var db = new MyApp.DAL.MyAppDbContext())
{
var user = db.Users.SingleOrDefault(u => u.UserName == username);
if (user == null)
return new string[] { };
return db.MembershipTypes == null ? new string[] { } :
db.MembershipTypes.Select(u => u.MembershipName).ToArray();
}
}
// -- Snip --
public override string[] GetAllRoles()
{
using (var db = new MyApp.DAL.MyAppDbContext())
{
return db.MembershipTypes.Select(r => r.MembershipName).ToArray();
}
}
// -- Snip --
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
これは非常に簡単に達成できるはずだと思います-ユーザーのロール名を設定するだけです...助けていただければ幸いです。
- アップデート -
カスタムメソッドの内容をコメントアウトしたところAddUserToRole()
、ユーザーがログインできるようになりました。ただし、アクション メソッドの呼び出しでは、ロール チェックは実行されませんでした。ロール名が実際には存在しないため、失敗するはずです:
[HttpGet]
[AllowAnonymous]
[Authorize(Roles="WaitConfirmationxxx")]
public ActionResult WaitConfirmation()
{
また、その中でdb呼び出しを行うIsInRole()
カスタムメソッドが呼び出されていることに気付きました。GetRolesForUser()
正確には最適ではなく、これが実際にどうあるべきか疑問に思っていますか?
if(User.IsInRole("WaitConfirmation"))
{
// email address has not yet been confirmed
return RedirectToAction("WaitConfirmation", "User");
}
- アップデート -
ここでの私の間違いは、使用する必要があると考えていたことですRoles.AddUserToRole()
(誰かが別のコメントをしない限り)。
また、web.config の定義にcacheRolesInCookie
パラメーターを追加しました。roleManager
<roleManager enabled="true" defaultProvider="CustomRoleProvider" cacheRolesInCookie="true">
だから今私が呼び出すと if(User.IsInRole("WaitConfirmation"))
、私のカスタムGetRolesForUser(string username)
が呼び出されます。
問題は、どのAuthorization
属性も機能しないことです。提案?