【发布时间】:2015-07-03 02:01:48
【问题描述】:
说实话,我似乎不太了解 OWIN 的概念——这是第一个无论我怎么尝试都无法理解的库 :(
现在问题...
我有两个 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 应用程序,但没有找到将令牌与经典 Web 应用程序混合的单个示例 - 除非我们计算 AngularJS 教程,遗憾的是这里不适用。
【问题讨论】:
标签: c# asp.net-mvc owin