Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 在MVC4中实现角色时出错_Asp.net Mvc 4_Membership - Fatal编程技术网

Asp.net mvc 4 在MVC4中实现角色时出错

Asp.net mvc 4 在MVC4中实现角色时出错,asp.net-mvc-4,membership,Asp.net Mvc 4,Membership,我正在尝试将用户注册到角色,但出现以下错误: No user found was found that has the name "MyName" 我已经使用默认模板创建了一个MVC4应用程序 我创建了一个自定义成员资格提供程序,并实现了CreateUser方法,如下所示 public User CreateUser(User i_userToCreate) { using (var _db = new Repository()) {

我正在尝试将用户注册到角色,但出现以下错误:

No user found was found that has the name "MyName"
我已经使用默认模板创建了一个MVC4应用程序

我创建了一个自定义成员资格提供程序,并实现了CreateUser方法,如下所示

public User CreateUser(User i_userToCreate)
    {

        using (var _db = new Repository())
        {

           User _user = _db.CreateUser(i_userToCreate);
           MembershipUser _membershipUser = new MembershipUser(providerName: "ATWMembershipProvider",
           name: _user.UserName,
           providerUserKey: null,
           email: _user.Email,
           passwordQuestion: "",
           comment: "",
           isApproved: true,
           isLockedOut: false,
           creationDate: DateTime.UtcNow,
           lastLoginDate: DateTime.UtcNow,
           lastActivityDate: DateTime.UtcNow,
           lastPasswordChangedDate: DateTime.UtcNow,
           lastLockoutDate: DateTime.UtcNow);

           return _user;
        }
这就是我配置web.config的方式

<appSettings>
<add key="enableSimpleMembership" value="false"/>
<add key="autoFormsAuthentication" value="false"/>
</appSettings>
<system.web>
<membership defaultProvider="ATWMembershipProvider">
  <providers>
    <clear/>
    <add name="ATWMembershipProvider" type="AroundTheWorld.Infrastructure.ATWMembershipProvider"
         enablePasswordRetrieval="false"
         ConnetionStringName="Context"
         enablePasswordReset="true"
         requiresQuestionAndAnswer="false"
         equiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5"
         minRequiredPasswordLength="6"
         minRequiredNonalphanumericCharacters="0"
         passwordAttemptWindow="10" applicationName="myApplication" />
  </providers>
</membership>
<roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider">
  <providers>
    <remove name="AspNetSqlRoleProvider" />
    <add name="AspNetSqlRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <!-- note: WebMatrix registers SimpleRoleProvider with name
     'AspNetSqlRoleProvider'. I don't know why but i kept it. -->
  </providers>
</roleManager>
我已经检查了以下内容:

  • 我的用户提供了所有必要的信息
  • 我在App_start“user”、“admin”中注册了两个角色
  • 但是我仍然得到一个错误,没有找到名为“MyName”的用户

    在asp web窗体中,为了保护基于角色的文件夹,不需要使用此选项

    我所要做的就是将控制器中的一个操作保护到一个特定的“角色”


    我已经解决了这个问题

    问题是因为我只实现了一个自定义成员资格提供程序,没有角色提供程序

    我已经注意到了这一点

    基本上,我创建了一个类
    MyOwnRoleProvider
    ,它继承自
    RoleProvider
    以及:

  • 实现了名为
    GetRolesForUser
  • 实现了名为
    GetUsersInRole
  • 最后,我将web.config修改为

    <roleManager defaultProvider="ATWRoleProvider" enabled="true" cacheRolesInCookie="true">
      <providers>
        <clear />
        <add name="ATWRoleProvider" type="AroundTheWorld.Infrastructure.ATWRoleProvider, AroundTheWorld" connectionStringName="Context" />
      </providers>
    </roleManager>
    

    我希望这将有助于某人

    [Authorize(Roles = "admin")]
        public ActionResult GetAllLocations()
        {
            using (var _db = new Repository())
            {
                return View(_db.GetLocations());
            }
        }
    
    <roleManager defaultProvider="ATWRoleProvider" enabled="true" cacheRolesInCookie="true">
      <providers>
        <clear />
        <add name="ATWRoleProvider" type="AroundTheWorld.Infrastructure.ATWRoleProvider, AroundTheWorld" connectionStringName="Context" />
      </providers>
    </roleManager>
    
    [Authorize(Roles="admin")]
    public ActionResult GetAllLocations()
    {
      using (var _db = new Repository())
      {
        return View(_db.GetLocations());
      }
    }
    
    @if (User.IsInRole("user"))