2015-07-02 4 views
1

Честно говоря, я, кажется, не понять концепцию Owin очень хорошо - это первая библиотека, я просто не могу не понять, независимо от того, что я пытаюсь :(OWIN - аутентификация на основе токенов в классическом веб-приложении MVC?

Теперь к проблеме ...

У меня есть два приложения MVC - один, который использует WebAPI, и тот, который этого не делает. Приложение WebAPI использует аутентификацию на основе токенов, и это работает, сейчас я пытаюсь реализовать аутентификацию во втором (не WebAPI) приложении, я знаю, как это сделать. Я попытался использовать код токена из приложения WebAPI, но потом понял, что генератор токенов не может быть вызван непосредственно в контроллере MVC, поэтому у меня получилось что-то вроде:

[HttpPost] 
public ActionResult Login(LoginModel loginData) 
{ 
    string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority); 

    string resultContent = ""; 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(Request.Url.GetLeftPart(UriPartial.Authority)); 
     var content = new FormUrlEncodedContent(new[] 
     { 
      new KeyValuePair<string, string>("grant_type", loginData.grant_type), 
      new KeyValuePair<string, string>("company", loginData.company), 
      new KeyValuePair<string, string>("password", loginData.password), 
      new KeyValuePair<string, string>("username", loginData.username) 
     }); 

     var result = client.PostAsync("/token", content).Result; 
     resultContent = result.Content.ReadAsStringAsync().Result; 
    } 

    string access_token = JsonConvert.DeserializeObject<dynamic>(resultContent).access_token; 
    if(TempData.Keys.Contains("Token")) 
    { 
     TempData.Remove("Token"); 
    } 
    TempData.Add("Token", access_token); 

    HttpCookie cookie = new HttpCookie("Token", access_token); 
    cookie.Expires = DateTime.Now.AddDays(-1); 

    HttpContext.Response.SetCookie(cookie); 

    if(loginData.fromUrl != null) 
    { 
     return Redirect(String.Format("{0}{1}", baseUrl, loginData.fromUrl)); 
    } 
    else 
    { 
     return Redirect(String.Format("{0}", baseUrl)); 
    } 
} 

(В то время как выше, работает это некрасиво, как ад, - не говоря уже об ошибке склонными.)

Тогда я изо всех сил, как придать маркер в каждый запрос, сделанный контроллером, я закончил с чем-то вроде этого:

protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    var token = this.Request.Cookies["Token"].Value; 

    this.Request.Headers.Add("Authorization", String.Format("Bearer {0}", token)); 

    base.OnAuthorization(filterContext); 
} 

Но он не работает. Я не знаю, если мой подход является правильным (если смотреть на него сейчас - это, вероятно, не ...) - поэтому вопросы:

  1. Если маркер подход, основанный использоваться на всех с не WebAPI, MVC приложений?
  2. Если это так - есть ли лучший способ сделать это, или мне действительно нужно написать «код спагетти», как выше, просто для простого генерируемого токена доступа? Я пытаюсь использовать его, чтобы иметь один универсальный подход к проверке подлинности, вместо многих - но, возможно, подход на основе файлов cookie должен использоваться вместо этого?
  3. Я пытаюсь использовать его, чтобы иметь один универсальный подход к аутентификации, вместо того, чтобы использовать много, но, возможно, подход на основе файлов cookie?

Я попытался следующие Owin учебники, а также построить в приложениях MVC, но не нашел ни одного примера смешивания фишку с классическим веб-приложение - если не считать AngularJS учебники, которые, к сожалению, не применяются здесь.

ответ

1

Я думаю, что подход на основе файлов cookie более подходит. Вы делаете слишком много работы, чем нужно, как вы уже заметили. Взгляните на образцы AAD, они являются хорошей отправной точкой для использования owin для аутентификации. В частности, я бы рекомендовал взглянуть на https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet, ToDoListService - это проект WebAPI и использует аутентификацию на основе токенов, ToDoListWebApp - это проект не WebAPI, который использует подход на основе файлов cookie. В этом репо есть много других образцов, которые могут вас заинтересовать.

+0

Спасибо за предложения и извините за мой очень поздний ответ, мы решили пойти совершенно по-другому: теперь мы попытаемся сопоставить IdentityUser с нашими таблицами пользователей и использовать встроенный Owin UserManger ... к сожалению, это появляется это еще одна сложная задача, поскольку, например, мы просто не используем в настоящее время претензии, поэтому OWIN жалуется на это - но это история для разных вопросов :) – user2384366

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