HttpContext.User.Idenity пуст - PullRequest
       7

HttpContext.User.Idenity пуст

2 голосов
/ 01 февраля 2010

Я использую asp.net и пытаюсь назначить роли для пользователя с проверкой подлинности с помощью форм:

    public ActionResult AdminLogin(string password, string username)
    {
        User _user = _us.GetUsers(username, password).FirstOrDefault();

        if (_user != null)
        {
            string _username = _user.Username;

            FormsAuthentication.SetAuthCookie(_username, false);

            string[] _roles = _us.GetUserRoles(_username);


            HttpContext.User = new GenericPrincipal(HttpContext.User.Identity, _roles);


            return RedirectToAction("Index", "Admin");

Когда я отлаживаю HttpContext.User.Identity всегда равен нулю, но _username и _roles содержат правильные данные. Как это исправить?

/ M

Ответы [ 3 ]

3 голосов
/ 01 февраля 2010

Ваше действие устанавливает IPrincipal пользователя для текущего контекста. Как только вы перенаправляете на другое действие (и все последующие запросы), создается новый HttpContext с нулевым IPrincipal пользователя.

Что вы можете сделать, это сохранить информацию в файле cookie аутентификации, а затем извлечь эти данные в методе Application_AuthenticateRequest в файле Global.asax и установить там свойство User для HttpContext.

Этот ответ содержит более подробную информацию и пример кода

0 голосов
/ 07 июля 2010

Я тоже боролся.

Я пытался выполнить свою аутентификацию и авторизацию в службе WCF с использованием стандартных поставщиков членства и ролей ASP.Net.

Я хотел передать учетные данные и «запрошенное приложение», чтобы определить, «аутентифицирован» ли пользователь для этого приложения. (не приложение ASP.Net, а приложение в моей собственной базе данных).

Для этого я хотел получить доступ к ролям, но не хотел «перенаправлять» или делать второй вызов моей службе WCF.

Вот код, который работает для меня:

Сначала я определяю, является ли пользователь действительным, следующим образом:

if (Membership.ValidateUser(CompanyCn, CompanyPwd))
{
    sbLogText.AppendFormat("\r\n\r\n\tValid User UID/PWD: '{0}'/'{1}'", CompanyCn, CompanyPwd);
    FormsAuthentication.SetAuthCookie(CompanyCn, false);
}

Тогда следующий код прекрасно работает для получения списка ролей:

List<string> roleList = new List<string>(Roles.GetRolesForUser(CompanyCn));
sbLogText.AppendFormat("\r\n\r\n\tUser ('{0}'): Roles ({1}):", CompanyCn, roleList.Count);
foreach (string s in roleList)
    sbLogText.AppendFormat("\r\n\t\tRole: {0}", s);
0 голосов
/ 01 февраля 2010

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

...