2014-11-12 8 views
0

Я, имеющих проблемы дизайна с asp.net веб-API, и хотел бы знать, как решить эту проблемукак разделить маркер между классами

public abstract class BaseApiController<TEntity> : ApiController where TEntity : Entity 
{ 

    protected string GetUsername() 
    { 
     return Utilities.GetUsername(Request.Headers.Authorization); 
    } 

    //some other code 

} 

public class StakeholderApiController : BaseApiController<Stakeholders> 
{ 
     ILogger _logger = new CustomApiLogger("StkhManager", GetUsername()) 

    //some other code 

} 

теперь проблема у меня есть:

У меня есть BaseApiController, который я использую совместно с некоторыми функциями между всеми ApiControllers.

И вот у меня есть определенный ApiController для определенных не общих функций.

Теперь, когда я записываю журнал, я хочу зарегистрировать имя пользователя для входа в систему, проблема в том, что я должен передавать его каждый раз, когда я создаю новый экземпляр, есть ли способ сделать глобальное имя пользователя в журнале для глобального текущий запрос api, чтобы к нему можно было получить доступ повсюду.

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

есть способ, которым я могу избежать передачи его каждый раз. Учитывая, что webapi не имеет гражданства, поэтому нельзя использовать сеанс, есть ли другой способ?

Я использую angularjs переднего конца, поэтому я не использую любой метод авторизации предоставленного MVC/.net

Примечание:

  1. Я не могу пошевелиться созданием Logger для базового класса по определенным причинам

  2. Это всего лишь один пример, я хочу использовать имя пользователя вошедшего в систему во многих других местах. Следовательно, не хотите передавать его.

+0

Вы пытались использовать 'Thread.CurrentPrincipal.Identity.Name'? – haim770

+0

Я использую angularjs на стороне клиента, поэтому не устанавливал ничего, что было выпущено в CurrentPrincipal на данный момент. Но если бы вы могли поделиться кодом о том, как я могу его установить, было бы замечательно ... – harishr

ответ

1

Существует стандартный шаблон в настройке и обращении к главному с помощью ASP.NET Web API. От ApiController, таких как ваш BaseApiController, вы можете использовать свойство User, чтобы получить то же самое. Чтобы установить его, как правило, HttpRequestContext получается из объекта запроса, а принципал устанавливается так.

Request.GetRequestContext().Principal = new ClaimsPrincipal(...);

BTW, вы можете получить доступ к текущему объекту запроса в трубопроводе Web API довольно много из любой точки мира.

+0

, но где я должен был инициализировать Principal, в BaseApiController ?? или при входе в систему? – harishr

+0

Вы должны установить принципала после аутентификации. – Badri

Смежные вопросы