使用我的API访问令牌验证C#MVC web应用程序的最佳方式

本文关键字:应用程序 web 最佳 方式 C#MVC 验证 我的 API 访问令牌 | 更新日期: 2023-09-27 18:24:24

我有一个构建在OWINIdentity之上的API(我遵循了这里的教程)。这非常有效,并且我有一个http://my.domain.com/token端点,它返回一个承载访问令牌

我现在正在构建一个MVCwe应用程序,该应用程序将访问API,通过标准jQueryajax调用让用户登录。但是一旦调用了http://my.domain.com/token端点并且从API返回了访问令牌,我如何以我的MVC web应用程序知道用户已通过身份验证的方式存储该值?

我希望我的web应用程序能够利用MVC标识功能,例如角色,这样我就可以做如下代码:

    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [Authorize]
        public ActionResult CompanySecrets()
        {
            return View();
        }

        [Authorize(Users="Stephen")]
        public ActionResult StephenSecrets()
        {
            return View();
        }

        [Authorize(Roles = "Administrators")]
        public ActionResult AdministratorSecrets()
        {
            return View();
        }
    }

因此,我的问题是:如何存储web API返回的访问令牌,并告诉我的MVC web应用程序身份验证成功

使用我的API访问令牌验证C#MVC web应用程序的最佳方式

对于一个项目,我面临着同样的场景。在我的案例中,我已经能够通过遵循本教程来实现您可能试图实现的目标:http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/

如果你查看上面的链接,你会发现非常有用的信息,以及关于OAuth的概念说明(这对我真的很有帮助)。我做的下一件事是使用这个配置创建一个Web应用程序

    public void ConfigureAuth(IAppBuilder app)
    {
        // Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    }

然后,在我的帐户控制器中,我只创建了一个Microsoft.AspNet.Identity.UserManager的实例,在Login操作中,我得到了以下内容:

   [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }
        return View(model);
    } 

这种方法的问题是,我正在实现的UserManager直接进入数据库,以便查找有关用户的信息。换句话说,我没有使用API,也没有使用访问令牌。WebApi为我提供访问令牌,但我只将它们用于移动设备和其他东西。

我现在想的方法是:

  1. Login操作中,向Web Api发出http请求以获取令牌
  2. 一旦我有了有效的令牌,我就可以使用令牌中的信息为当前用户设置System.Security.Claims.ClaimsIdentity
  3. 然后我可以使用HttpContext.GetOwinContext().Authentication.SignIn方法来指示用户已通过身份验证
  4. 最后,我可以使用HTML5存储API本地保存AccessToken及其Refresh令牌。这样,我就可以继续直接从javascript使用WebApi,并在我的Web应用程序上使用授权功能

这只是我的想法。我仍在研究中,但我必须尽快实施一些措施。我希望这能给你更多的线索,也许你会想到比这更好的东西(你会和我们分享)。

看看我在这个系列中的最新文章吧,你可以将你的MVC应用程序视为你的资源服务器,但在我的解决方案中,我只使用承载令牌进行身份验证,我的资源服务器中没有cookie。我相信它也应该起作用,你可以从授权的角色中受益。

我建议您查看Identity团队的预发布,以推动更快的原型开发。

除此之外,我建议您从这里开始,它将为您提供MVC和.NET的良好基础http://www.asp.net/mvc/tutorials/mvc-5/introduction/getting-started

您可以通过在声明中添加令牌来使用AuthenticationManager.SignIn方法。然后这些声明可以在MVC应用程序中使用

示例

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, 
await user.GenerateUserIdentityAsync(UserManager));