Честно говоря, я, кажется, не понять концепцию 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);
}
Но он не работает. Я не знаю, если мой подход является правильным (если смотреть на него сейчас - это, вероятно, не ...) - поэтому вопросы:
- Если маркер подход, основанный использоваться на всех с не WebAPI, MVC приложений?
- Если это так - есть ли лучший способ сделать это, или мне действительно нужно написать «код спагетти», как выше, просто для простого генерируемого токена доступа? Я пытаюсь использовать его, чтобы иметь один универсальный подход к проверке подлинности, вместо многих - но, возможно, подход на основе файлов cookie должен использоваться вместо этого?
- Я пытаюсь использовать его, чтобы иметь один универсальный подход к аутентификации, вместо того, чтобы использовать много, но, возможно, подход на основе файлов cookie?
Я попытался следующие Owin учебники, а также построить в приложениях MVC, но не нашел ни одного примера смешивания фишку с классическим веб-приложение - если не считать AngularJS учебники, которые, к сожалению, не применяются здесь.
Спасибо за предложения и извините за мой очень поздний ответ, мы решили пойти совершенно по-другому: теперь мы попытаемся сопоставить IdentityUser с нашими таблицами пользователей и использовать встроенный Owin UserManger ... к сожалению, это появляется это еще одна сложная задача, поскольку, например, мы просто не используем в настоящее время претензии, поэтому OWIN жалуется на это - но это история для разных вопросов :) – user2384366