Вопрос по asp.net-mvc, asp.net-membership – Можете ли вы обернуть RolePrincipal в пользовательский объект IPrincipal?

4

Я использую нестандартные поставщики членства и роли в рамках ASP.NET с проверкой подлинности с помощью форм. Они работают отлично. Поставщик ролей использует файл cookie для сохранения ролей, сохраняя поездку в базу данных при каждом веб-запросе. Я также использую строку UserData внутри FormsAuthenticationTicket для хранения UserId.

Мне нужно реорганизовать мой DAL из веб-проекта в собственный проект. DAL зависит от получения идентификатора текущего пользователя, а также от проверки ролей на наличие прав. Как должна измениться моя система аутентификации, чтобы я мог использовать Thread.CurrentPrincipal без ссылки на System.Web в проекте DAL?

В настоящее время платформа провайдера создает объекты RolePrincipal и FormsIdentity и присоединяет его к Thread.CurrentPrincipal.

Я думал о создании пользовательской оболочки IPrincipal вокруг RolePrincipal во время события Application_PostAuthenticateRequest. В этом случае я могу получить идентификатор пользователя из FormsAuthenticalTicket и передать его этому новому wrapperPrincipal вместе с RolePrincipal.

Это правильный подход? Буду ли я в конечном итоге вызывать некоторые проблемы в проекте, связываясь со структурой провайдера?

Спасибо, Кит

protected void Application_PostAuthenticateRequest()
{
    if (Request.IsAuthenticated)
    {
        FormsIdentity identity = (FormsIdentity)User.Identity;

        if (identity != null)
        {
            FormsAuthenticationTicket ticket = identity.Ticket;

            int id = 1;

            if (identity != null)
            {
                int.TryParse(identity.Ticket.UserData, out id);
            }

            var wrapperPrincipal = new WrapperPrincipal(User, id);
            System.Threading.Thread.CurrentPrincipal = WrapperPrincipal;
        }
    }
}   



[Serializable]
public class WrapperPrincipal : IPrincipal
{        
    private IPrincipal principal;

    public WrapperPrincipal(IPrincipal principal, int userId)
    {
        this.principal = principal;
        this.Id = userId;
    }

    public int Id { get; set; }

    public IIdentity Identity
    {
        get { return principal.Identity; }
    }

    public bool IsInRole(string role)
    {
        return principal.IsInRole(role);
    }
}
Error: User Rate Limit Exceeded Arthur Nunes
Error: User Rate Limit Exceeded user357086

Ваш Ответ

1   ответ
0

Error: User Rate Limit ExceededASP.NET MVC - установить пользовательский IIdentity или IPrincipal. You cant mess anything because it is just wrapper, u just delegete origin principal members, you dont even touch it. I would call it clever solution.

Похожие вопросы