Невозможно получить роль с помощью Context.User.IsRole

Я пишу следующий код для доступа к странице, но у меня это не работает

if (User.Identity.IsAuthenticated)
    {
        if (Context.User.IsInRole("DistrictAdmin"))
        {
            if (!IsPostBack)
            {
            }
        }
        else
        {
            Response.Redirect("Default.aspx");
        }
    }
    else
    {
        Response.Redirect("Default.aspx");
    } 

Мой код проверки входа

  string RoleTypeID;
    objLogin.UserName = txtUsername.Text;
    objLogin.Password = txtPassword.Text;

    if (objLogin.getRoles(out RoleTypeID))
    {
        Session["RoleID"] = RoleTypeID;
        FormsAuthenticationTicket oAuthTicket = new FormsAuthenticationTicket(1, txtUsername.Text, DateTime.Now, DateTime.Now.AddMinutes(20), false, RoleTypeID.ToString(), FormsAuthentication.FormsCookiePath);
        string encryptoAuthTicket = FormsAuthentication.Encrypt(oAuthTicket);


        HttpCookie oCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptoAuthTicket); // Name of auth cookie

        if (oAuthTicket.IsPersistent) oCookie.Expires = oAuthTicket.Expiration;

        HttpContext.Current.Response.Cookies.Add(oCookie);
        if (RoleTypeID == "DistrictAdmin" || RoleTypeID == "CampusAdministrator" || RoleTypeID == "LPACMember")
        {
            Response.Redirect("LEPstudentrecords.aspx");
        }
    }
    else
    {
        lblInvalid.Visible = true;
    }

и в моем web.config я установил следующее

     <roleManager enabled="false" />
    <authentication mode="Forms">
  <forms loginUrl="Default.aspx"
timeout="20" />
</authentication>

    <sessionState mode="InProc" timeout="180"></sessionState>

Но я не могу получить роль, даже если он аутентифицирован, может ли кто-нибудь сказать, что делать?

Вот изображение после аутентификации, все становится правильно, но я не могу получить доступ к этой странице

введите описание изображения здесь


person Developer    schedule 12.07.2011    source источник
comment
Почему roleManager enabled="false" ???   -  person leppie    schedule 12.07.2011
comment
Потому что я получаю роли с моего сервера sql   -  person Developer    schedule 12.07.2011


Ответы (2)


Вы добавляете строку роли как «UserData» в FormsAuthenticationTicket. Нет никакой магии, которая могла бы сделать вывод об этом значении роли.

Предлагаю вам еще раз ознакомиться с документацией.

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.formsauthenticationticket

См. http://www.codeproject.com/KB/web-security/formsroleauth.aspx для примера без RoleManager.

person leppie    schedule 12.07.2011
comment
Привет, Леппи, я не понял, ты можешь сказать, какие изменения мне следует внести в свой код - person Developer; 12.07.2011
comment
Посмотрите на параметр, в который вы передаете это имя роли. Это НЕ для роли, это для пользовательских данных. - person leppie; 12.07.2011
comment
Даже если я удалю это из своего кода, и проблема останется прежней. - person Developer; 12.07.2011
comment
Это вполне ожидаемо. IIRC, вам нужно обернуть FormsIdentity в GenericPricipal и назначить его Context.User, если не используется встроенный RoleManager. - person leppie; 12.07.2011

Это потому, что вы не настроили RoleManager. В вашем web.Config он отключен.

<roleManager enabled="false" />

Вам нужно использовать существующий RoleProvider или написать свой собственный.

Пример конфигурации

<roleManager enabled="true" defaultProvider="SqlRoleManager">
  <providers>
    <add name="SqlRoleManager" 
         type="System.Web.Security.SqlRoleProvider"
         connectionStringName="SqlRoleManagerConnection"
         applicationName="MyApplication" />
  </providers>
</roleManager>

Вот несколько ссылок о поставщиках ролей

RoleProvider

Реализация настраиваемого поставщика ролей

person Eranga    schedule 12.07.2011
comment
Я не использую роли по умолчанию, я использую определенные пользователем роли из моих данных - person Developer; 12.07.2011
comment
Context.User относится к типу RolePrinciple. Он использует сконфигурированный RoleProvider при вызове метода IsInRole. Поэтому вам нужно написать настраиваемого поставщика ролей, чтобы использовать этот метод. - person Eranga; 12.07.2011