OWIN-基于令牌的身份验证,基于经典MVC web应用程序
本文关键字:MVC 经典 web 于经典 应用程序 于令牌 令牌 OWIN- 身份验证 | 更新日期: 2023-09-27 18:00:42
老实说,我似乎没有很好地理解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教程,否则遗憾的是,这些教程不适用于此。
我认为基于cookie的方法更合适。正如您已经注意到的,您所做的工作太多了。看看AAD示例,它们是使用owin进行身份验证的一个很好的起点。特别是,我建议你看看https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet,ToDoListService
是一个WebAPI项目,使用基于令牌的身份验证,ToDoListWebApp
是一个使用基于cookie的方法的非WebAPI项目。回购中还有很多其他样本可能会引起你的兴趣。