【问题标题】:OWIN - token based authentication on classic MVC web application?OWIN - 经典 MVC Web 应用程序上基于令牌的身份验证?
【发布时间】: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);
}

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

  1. 是否应该对非 WebAPI、MVC 应用程序使用基于令牌的方法?
  2. 如果是这样 - 有没有更好的方法来做到这一点,还是我真的需要像上面那样编写“意大利面条代码”只是为了简单地生成访问令牌?我正在尝试使用它来拥有一种通用身份验证方法,而不是多种 - 但也许应该使用基于 cookie 的方法?
  3. 我正在尝试使用它来拥有一种通用身份验证方法,而不是多种 - 但也许应该使用基于 cookie 的方法?

我尝试遵循 OWIN 教程以及构建 MVC 应用程序,但没有找到将令牌与经典 Web 应用程序混合的单个示例 - 除非我们计算 AngularJS 教程,遗憾的是这里不适用。

【问题讨论】:

    标签: c# asp.net-mvc owin


    【解决方案1】:

    我认为基于 cookie 的方法更合适。正如您已经注意到的那样,您所做的工作超出了需要。查看 AAD 示例,它们是使用 owin 进行身份验证的一个非常好的起点。特别是,我建议看一下https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNetToDoListService 是一个 WebAPI 项目并使用基于令牌的身份验证,ToDoListWebApp 是非 WebAPI 项目,它使用基于 cookie 的方法。该 repo 中还有很多其他示例,您可能会感兴趣。

    【讨论】:

    • 感谢您的建议,也很抱歉我的回复很晚,我们决定采用完全不同的方法 - 现在我们将尝试将 IdentityUser 映射到我们的用户表并使用内置的 Owin UserManger。 .. 不幸的是,这似乎是另一件很难做的事情,因为 - 例如 - 我们目前根本不使用声明,所以 OWIN 抱怨这一点 - 但这是一个不同问题的故事:)
    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2019-10-19
    • 2014-06-04
    • 2021-11-13
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多