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);
}

但它似乎不起作用。我不知道我的方法是否正确(现在来看——可能不是…)——所以问题是:

  1. 基于令牌的方法是否应该用于非WebAPI、MVC应用程序
  2. 如果是这样的话,有没有更好的方法可以做到这一点,或者我真的需要像上面那样编写"意大利面条代码"来简单地生成访问令牌?我试图用它来实现一种通用的身份验证方法,而不是多种方法——但也许应该使用基于cookie的方法
  3. 我试图用它来实现一种通用的身份验证方法,而不是多种方法——但也许应该使用基于cookie的方法

我尝试了遵循OWIN教程以及内置MVC应用程序,但没有找到一个将令牌与经典web应用程序混合的例子——除非我们计算AngularJS教程,否则遗憾的是,这些教程不适用于此。

OWIN-基于令牌的身份验证,基于经典MVC web应用程序

我认为基于cookie的方法更合适。正如您已经注意到的,您所做的工作太多了。看看AAD示例,它们是使用owin进行身份验证的一个很好的起点。特别是,我建议你看看https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet,ToDoListService是一个WebAPI项目,使用基于令牌的身份验证,ToDoListWebApp是一个使用基于cookie的方法的非WebAPI项目。回购中还有很多其他样本可能会引起你的兴趣。