1

私の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属性も機能しないことです。提案?

4

1 に答える 1