如何在ASP.NET Web API和MVC中使用相同的标识?

时间:2015-11-17 13:34:50

标签: angularjs asp.net-mvc authentication asp.net-web-api token

我有以下情况:

  1. MVC App - 安装了Identity的ASP.NET MVC应用程序。
  2. SPA App - 位于MVC App内部区域的Angular SPA应用程序。
  3. Web API - SPA App使用的ASP.NET Web API服务。
  4. 两者,MVC App和Web API都应该使用相同的用户帐户。所以,现在,我已经在MVC应用程序中安装了Identity。其中将有一个View将加载SPA App,而SPA App将向Web API发出请求。但Web API仅在用户通过身份验证时才有效,因此需要客户端发送的承载令牌。因此,当用户在MVC应用程序中进行身份验证并使用SPA应用程序打开视图时,我应该以某种方式为在MVC应用程序中进行身份验证的同一用户获取令牌,将其放入SPA应用程序中,并从中发送令牌SPA App JavaScript到Web API。

    这可能吗?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作,创建新的类库项目。将所有标识组件从mvc项目移动到该库。将该项目引用到web api项目和mvc项目。

我在几个需要api和mvc的项目中完成了。这个对我有用。试试这个肯定会有效。如果您没有正确理解,请告诉我

答案 1 :(得分:0)

这不是您的问题的真正答案,但如果您仅使用Asp.net MVC来引导您的单页应用程序,那么您可以选择仅使用web api身份验证。在您的spa引导后,您可以检查您是否拥有经过身份验证的用户并获取用户特定信息以自定义您的用户页面。

在这种情况下,您不需要使用Asp.net MVC身份验证,但有时您可能需要使用Asp.net会话来处理验证码验证(如果您的验证码库需要)。对于这种情况,您可以为您的特定web-api调用启用会话,如下所示。

    //WebApi Session
    protected void Application_PostAuthorizeRequest()
    {
        if (HttpContext.Current == null)
            return;

        var request = HttpContext.Current.Request;
        if(RequireSession(request))
            HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
    }

    private static bool RequireSession(HttpRequest request)
    {
        return request.AppRelativeCurrentExecutionFilePath == "~/api/user" && request.HttpMethod == "POST";
    }

不是:如果为所有web-api调用启用asp.net mvc会话,则将按顺序处理您的请求。不推荐!

Concurrent Requests and Session State