现有ASP.NET MVC应用程序中基于令牌的授权

时间:2014-07-18 11:26:24

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-web-api

我继承了现有的应用程序。此应用程序使用ASP.NET MVC 3.它有一些API。这些API如下所示:

[AcceptVerbs(HttpVerbs.Post)]
[Endpoint]
public ActionResult AuthenticatePlayer(string username, string password)
{
  // Ensure that the user entered valid credentials
  if (Membership.ValidateUser(username, password) == false)
    return Json(new { statusCode = StatusCodes.INVALID_CREDENTIALS, message = "You entered an invalid username or password. Please try again." });


  // Get the profile of the person that just logged in.
  ProfileCommon userProfile = (ProfileCommon)(ProfileCommon.Create(username));
  if (userProfile != null)
  {
    string name = username;
    if (String.IsNullOrEmpty(userProfile.FirstName) == false)
      name = userProfile.FirstName;


    return Json(new {
      statusCode = StatusCodes.SUCCESS,
      payload = name,
      username = username.ToLower(),
    });
  }
}

[AcceptVerbs(HttpVerbs.Get)]
[Endpoint]
public ActionResult SomeUserAction(string q)
{
  // TODO: Ensure the user is authorized to perform this action via a token

  // Do something
  return Json(new { original = q, response = DateTime.UtcNow.Millisecond }, JsonRequestBehavior.AllowGet);
}

我试图弄清楚如何将基于令牌的授权架构集成到此流程中。根据我的理解,基于令牌的系统如果成功登录,将向用户返回短期令牌和刷新令牌。然后,每个方法都可以通过查看令牌来检查用户是否有权执行操作。我试图了解它是否内置于ASP.NET MVC中,或者是否有可以使用的库。我需要弄清楚完成这项工作的最短路。

非常感谢你!

2 个答案:

答案 0 :(得分:2)

我在一年前建立了一个WebAPI Token Authentication库,提供基于令牌的身份验证:

  

WebAPI Token Auth Bootstrap 是开箱即用的基于令牌的WebAPI应用程序用户身份验证,提供随时可用的“TokenAuthorize”   属性和'TokenAuthApiController'控制器。

     

其中的功能 - 基于令牌的用户身份验证用户属性   TokenAuthApiController(Id,用户名,角色,LastAccess)。

     

基于令牌的用户授权TokenAuthorizeAttribute with Access   级别 - 公共,用户,管理员或匿名。

     

内置功能Login(),Logoff(),Error(),Unauthorized()   回应各种超载。

您可以在 here 中详细了解GitHub及其自己的维基。

现在我正在开发一个Node.js应用程序,我使用的是使用Node.js库的Json Web Tokens(JWT),它非常简单明了..毕竟它的Node.js;)

我看到在this article上解释了JWT的.NET实现,我建议你看一下。

答案 1 :(得分:0)

您可以使用Owin ...即Microsoft.owin.security

我没有尝试过这个实现,但这只是为了给你一个想法:

var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
var currentUtc = new SystemClock().UtcNow;
ticket.Properties.IssuedUtc = currentUtc;
ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 

return Json(new {
    statusCode = StatusCodes.SUCCESS,
    payload = name,
    username = username.ToLower(),
    accessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket)
});