Роли — проблема с User.IsInRole

У меня есть страница регистрации, на которой пользователю назначается роль следующим образом, когда пользователь нажимает кнопку отправки:

    MembershipUser oMU;

    if (!(Roles.RoleExists("Stream")))
    {
        Roles.CreateRole("Stream");
    }

    oMU = Membership.CreateUser(txtUserName.Text.Trim(), txtPassword.Text.Trim(), txtEmail.Text.Trim());

    Membership.UpdateUser(oMU);

    Roles.AddUserToRole(oMU.UserName, "Stream");

Когда пользователь переходит на экран входа в систему, у меня есть следующее:

Когда пользователь входит в систему, мне нужно убедиться, что он действительно является частью этой роли:

    if (User.IsInRole("Stream"))
    {

    }

но он никогда не входит в блок User.IsInRole. Что мне нужно сделать, чтобы зарегистрированный пользователь был частью роли, чтобы она работала с User.IsInRole.

Обратите внимание, что у меня есть папка как таковая, поэтому мне нужно, чтобы они были частью роли потоковой передачи:

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

person Nate Pet    schedule 19.04.2013    source источник


Ответы (2)


Переместите <allow roles="Stream" /> выше <deny users="*" />. В противном случае всем пользователям будет отказано.

<configuration>
   <system.web>
    <authorization>
        <allow roles="Stream" />    
        <deny users="*" />       
    </authorization>
    </system.web>
</configuration>

Убедитесь, что у вас есть членство и RoleManager в web.config

Вот образец -

<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <clear/>
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="XXXXXSqlConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="XXXXX"/>
  </providers>
</membership>
<roleManager enabled="true" cacheRolesInCookie="false" defaultProvider="DefaultRoleProvider">
  <providers>
    <clear/>
    <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="XXXXXSqlConnection" applicationName="XXXXX"/>
  </providers>
</roleManager>
person Win    schedule 19.04.2013
comment
На самом деле это не отвечает на заданный вопрос (если я правильно понимаю вопрос). Хотя я согласен, что ОП должен это сделать. - person Josh Darnell; 20.04.2013
comment
Да, спасибо Вин. Но почему он даже не доходит до if (User.IsInRole(Stream)) { } - person Nate Pet; 20.04.2013
comment
Не могли бы вы убедиться, что для параметра cacheRolesInCookie RoleManager задано значение false в веб.конфиг? - person Win; 20.04.2013
comment
Я не. Я предполагаю, что должен сделать это в своем корневом файле web.config? - person Nate Pet; 20.04.2013
comment
Теоретически вы должны переопределить значение по умолчанию своим собственным, потому что вы можете не знать, что находится внутри web.config и machine.config вашего хостинг-сервера. Смотрите мой обновленный ответ. - person Win; 20.04.2013
comment
Привет, Вин, я добавил false в кеш, но все еще получаю ту же проблему. - person Nate Pet; 20.04.2013
comment
В каком событии находится if (User.IsInRole("Stream")) { }? Пожалуйста, добавьте полный код события. - person Win; 20.04.2013
comment
Привет, Win - это здесь: protected void btnLogin_Click (отправитель объекта, EventArgs e) { if (User.IsInRole (Stream)) { const string url = ~/StreamingVideo/WatchLive/SmartWaterStream.aspx; Ответ.Перенаправление(url); } else { lblMessage.Text = Неверная комбинация имени пользователя и пароля; } - person Nate Pet; 21.04.2013
comment
Как я уже сказал в другом вашем вопросе, объект IPrincipal внедряется в HttpContext.Current.User только в Application_AuthenticateRequest. Поэтому внутри метода btnLogin_Click вам необходимо явно вызывать методы с параметром имени пользователя - Roles.IsUserInRole(Username, Stream). - person Win; 22.04.2013

Попробуйте использовать HttpContext, чтобы получить текущего пользователя для входа:

if (HttpContext.Current.User.IsInRole("Stream"))
{

}
person Firoz Ansari    schedule 19.04.2013