MVC3 Custom AuthorizeAttribute: как передать объект из контроллера - PullRequest
1 голос
/ 22 июня 2011

У меня есть объект, который содержит все данные для входа в систему, которые находятся в моем контроллере (он был запрограммирован до переключения на MVC3).

Я пытаюсь добавить авторизацию на сайт, пока у меня есть:

public LoginObject MyLoginObject
{
   get;
   set;
}

[CustomAuthorization()]
public ActionResult Index()
{
 return View();
}

и

public class CustomAuthorization : AuthorizeAttribute
{
   protected override bool AuthorizeCore(HttpContextBase httpContext)
   {
    return true;
    //should be return myLoginObject.IsLoggedIn;
   }
}

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

Редактировать: Мое решение основано на совете Зонненберга.

public class LoginObject : IPrincipal // Now extends IPrincipal 
{
   ... //old code
   private class IdentityImpl : IIdentity
{
  public string AuthenticationType
  {
    get;
    set;
  }

  public bool IsAuthenticated
  {
    get;
    set;
  }

  public string Name
  {
    get;
    set;
  }
}

public IIdentity Identity
{
  get { return new IdentityImpl { AuthenticationType = "Custom Authentication", IsAuthenticated = this.IsLoggedIn, Name = this.Id}; }
}
}

Затем я переместил создание объекта loginobject в CustomAuthorization

public override void OnAuthorization(AuthorizationContext filterContext)
{
  // ... Set up LoginObject
    filterContext.RequestContext.HttpContext.User = myLoginObject;

  base.OnAuthorization(filterContext);
}

Итак, теперь вход в систему выполняется внутри авторизации, и я могу позвонить пользователю, чтобы получить доступ к логину с контроллера.

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Вы можете проверить, вошел ли пользователь в систему, используя httpContext.User.Identity.IsAuthenticated .

Для хранения дополнительной информации вы можете использовать httpContext.User объект.Вы можете написать собственную реализацию IPrincipal и IIdentity для хранения всех видов информации для входа в систему.

Другой вариант - сохранить информацию для входа в систему в сеансе.

0 голосов
/ 22 июня 2011

Как создается ваш LoginObject?

Если он создается с помощью службы или репозитория (например, MyLoginObject = loginService.GetLogin(), то вы можете переместить этот вызов в атрибут CustomAuthorization.

Если логика находится внутри самого контроллера, то это должно быть реорганизованов службу или хранилище, в зависимости от архитектуры вашего решения, чтобы вы могли сделать выше.

...