Не отображаются роли участника в приложении ASP.NET MVC 2

Я пишу приложение ASP.NET MVC 2 и не хочу использовать членство в ASP.NET. Я хочу использовать атрибут авторизации на контроллерах. Что я сделал до сих пор ...

Web.config

<roleManager enabled="true" />

<authentication mode="Forms">
  <forms loginUrl="~/Authentication/Login" timeout="2880"/>
</authentication>
<authorization>
  <allow users="*" /> /* This is for testing */
</authorization>

В моем Global.asax

 protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        var cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];

        if (cookie == null) return;
        var decryptedCookie = FormsAuthentication.Decrypt(cookie.Value);            
        var roles = decryptedCookie.UserData.Split('|');

        var tcmIdentity = new TcmIdentity(decryptedCookie.Name);
        var tcmPrincipal = new GenericPrincipal(tcmIdentity, roles);

        Context.User = tcmPrincipal;
    }

Я использую настраиваемый объект IIdentity, чтобы в будущем добавить некоторые настраиваемые свойства. Чтобы проверить это в моем действии контроллера, я сделал это ...

var testPrincipal = User;

Я могу видеть настраиваемую личность со всей информацией о пользователе, но для основного объекта нет ролей. Любая помощь с тем, что я пропустил, была бы замечательной. Спасибо.


person abarr    schedule 11.08.2010    source источник


Ответы (2)


Я считаю, что вам нужен поставщик ролей. Подобно тому, как поставщик членства обрабатывает членство пользователей, создает, удаляет, проверяет, редактирует, чтобы использовать роли, вам необходимо использовать RoleProvider (Реализация поставщика ролей в ASP.NET).

Что также требует включения ролей в web.config, например:

<roleManager enabled="enabled" defaultProvider="AspNetSqlRoleProvider">
  <providers>
    <clear/>
      <add name="AspNetSqlRoleProvider" 
           type="System.Web.Security.SqlRoleProvider"
           connectionStringName="ApplicationServices" 
           applicationName="/" />
      <add name="AspNetWindowsTokenRoleProvider"
           type="System.Web.Security.WindowsTokenRoleProvider"
           applicationName="/" />
  </providers>
</roleManager>

Это может быть полезно: SO asp-net-mvc- роли без базы данных и без поставщика ролей

Как могло бы быть: ASP.NET 2.0, назначение настраиваемой роли без "Поставщик ролей"

person Erik Philips    schedule 11.08.2010
comment
Эрик, спасибо за информацию. Я шел по пути реализации настраиваемого диспетчера ролей, когда обнаружил ссылку для добавления участника в текущий поток. Как только я это сделал, я был мил. Обновите ниже. Андрей - person abarr; 11.08.2010
comment
Замечательно, я бы посоветовал пометить ваш ответ как ответ, чтобы в разделе «Неотвеченные вопросы» не было ответов на вопросы. - person Erik Philips; 11.08.2010

ОБНОВИТЬ:

В конце концов, я получил эту работу, изменив

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    var cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];

    if (cookie == null) return;
    var decryptedCookie = FormsAuthentication.Decrypt(cookie.Value);            
    var roles = decryptedCookie.UserData.Split('|');

    var tcmIdentity = new TcmIdentity(decryptedCookie.Name);
    var tcmPrincipal = new GenericPrincipal(tcmIdentity, roles);

    Context.User = tcmPrincipal;
}

to

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    var cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];

    if (cookie == null) return;
    var decryptedCookie = FormsAuthentication.Decrypt(cookie.Value);            
    var roles = decryptedCookie.UserData.Split('|');

    var tcmIdentity = new TcmIdentity(decryptedCookie.Name);
    var tcmPrincipal = new GenericPrincipal(tcmIdentity, roles);

    Thread.CurrentPrincipal = Context.User = tcmPrincipal;
}
person abarr    schedule 11.08.2010