使用来自web api

时间:2016-08-04 11:08:03

标签: c# oauth-2.0 authorization asp.net-core openiddict

我有一个连接到数据库的web api,它使用OpenIddict和密码流(Resource Owner Password Credentials Grant)提供访问令牌:

services.AddOpenIddict<TestUser, IdentityRole<Guid>, CompleteContext, Guid>()
                .EnableTokenEndpoint("/connect/token")
                .AllowPasswordFlow()
                .AllowRefreshTokenFlow()
                .DisableHttpsRequirement()
                .AddEphemeralSigningKey();

web api具有受保护的操作,只能使用有效的访问令牌进行调用。这很好。

我有一个网络应用,应使用相同的访问权限进行授权。用户输入他的凭据,Web应用程序将其发送到API以获取访问令牌。我想,Web应用程序可以使用此访问令牌进行授权,但我现在不知道如何在asp.net核心中设置中间件。

背景: Web应用程序和Web api应该在不同的服务器上运行,之后我想创建使用web api访问数据的移动应用程序。这就是我想使用令牌的原因。我希望web api成为唯一可以访问数据库的项目。

修改更多背景资料: 该网络应用程序是一个mvc 6应用程序,具有标准用户功能:注册,登录,注销,电子邮件确认和与用户生成的内容的一些交互。所有这些内容都应存储在数据库中。因为我可能需要稍后添加移动应用程序,所以我希望有一个单独的web api来存储和访问数据库中的数据。 web api的唯一目的是处理数据访问。 mvc Web应用程序应与web api通信以获取和存储数据。必须对用户进行身份验证才能使用Web应用程序,并且必须对Web应用程序进行身份验证才能访问Web API。没有第三方应用程序,这让我想到了密码流。我知道,用户在Web应用程序中输入他的凭据以从Web api获取访问令牌。我的计划是,访问令牌存储在cookie中,以便Web应用程序可以根据需要使用它来访问Web API。我是否可以在Web应用程序中使用此访问令牌进行身份验证和授权?也许类似于创建自定义SignInManagerUserManager,或者让Web应用程序数据库访问并使用标准的asp.net身份。或者还有其他更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

  

我想,网络应用可以使用此访问令牌进行授权,但我现在还不知道如何在asp.net核心中设置中间件。

ASP.NET Core中没有任何内容可以帮助您实现&#34;资源所有者密码凭据授权&#34;客户。幸运的是,您可以使用HttpClient轻松完成自己的工作。以下是如何做到这一点(请注意,错误处理留作练习):

public async Task<IActionResult> SignIn(string username, string password)
{
    if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
    {
        return View("MissingCredentials");
    }

    var request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/connect/token");
    request.Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        ["client_id"] = "your client_id",
        ["client_secret"] = "your client_secret",
        ["grant_type"] = "password",
        ["username"] = "username",
        ["password"] = "password"
    });

    var response = await client.SendAsync(request, notification.Request.CallCancelled);
    response.EnsureSuccessStatusCode();

    var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
    var token = payload.Value<string>("access_token");
    if (string.IsNullOrEmpty(token))
    {
        return View("InvalidCredentials");
    }

    var identity = new ClaimsIdentity("Cookies");
    identity.AddClaim(new Claim("access_token", token));

    return SignIn(new ClaimsPrincipal(identity), "Cookies");
}

或者,您可以考虑使用授权代码等交互式流程,这样您就可以使用ASP.NET团队开发的OpenID Connect客户端中间件。您可以尝试使用此OpenIddict MVC sample来了解其工作原理。