使用Web API身份验证对MVC应用程序进行身份验证

时间:2016-10-21 09:01:24

标签: c# asp.net-mvc cookies asp.net-web-api2 asp.net-identity-2

概述:

我在 ABC 域上有 Web API, XYZ 域上有 MVC应用程序。 < / p>

当用户使用API​​进行身份验证时,我正在调用MVC应用程序,该应用程序复制登录方法并为MVC应用程序设置cookie,从而允许用户在来自一个端点的两个应用程序上进行身份验证。

问题:

从API到MVC应用程序的调用工作正常,但是没有设置cookie。因此,在使用API​​进行身份验证后访问我的MVC应用程序时,我仍然需要登录。

对MVC应用程序的Web API调用:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://xyz.co.uk");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var content = new FormUrlEncodedContent(new[] 
    {
        new KeyValuePair<string, string>("refreshTokenId", token.Id)
    });

    // HTTP POST
    HttpResponseMessage response = await client.PostAsync("Account/LoginFromAPI", content);
}

MVC应用程序登录(来自API调用):

[HttpPost]
[AllowAnonymous]
public void LoginFromAPI(string refreshTokenId)
{
    RefreshToken refreshToken = null;

    // Get refresh token from the API database
    using(var api = new APIContext())
    {
        refreshToken = api.RefreshTokens.SingleOrDefault(x => x.Id == refreshTokenId);
    }

    if (refreshToken != null)
    {
        // Find the user in the MVC application database
        var user = this.UserManager.FindByEmail(refreshToken.Subject);

        if (user !=  null)
        {
            // The below code works fine for normal login through the MVC application, 
            // but not by the call from the API
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
            ClaimsIdentity identity = user.GenerateUserIdentity(this.UserManager);
            AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = rememberMe }, identity);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

问题是您正在为XYZ域设置Cookie。 Cookie是特定于域的,因此当您向ABC域发送请求时,cookie不会被附加,反之亦然。您需要做的是设置一个身份验证服务器,为您的应用程序提供单点登录功能。您可以查看Active Directory联合身份验证服务或ThinkTecture IdentityServer。所有请求都将从您的身份验证服务器进行身份验证,并重定向到目标服务器进行处理。这就是Microsoft帐户和许多其他帐户管理服务实现单点登录的方式。祝你好运!