如何通过现有的Web API验证我的MVC 5应用程序?

时间:2015-02-02 17:00:26

标签: c# asp.net-mvc-5 asp.net-web-api2

我正在创建一个 ASP.NET MVC 5 应用程序。我无法访问数据库。我所做的一切都通过 WebApi

我想通过此API对用户进行身份验证,同时获取访问令牌。

如何在不丢弃Visual Studio放置在MVC 5应用程序中的所有帐户维护代码的情况下执行此操作?

我认为这会在某个地方的框架中,但我在互联网上找到的一切似乎都是黑客。我拒绝破解与安全有关的任何事情。我怎么能这样做?

我正在使用原始ASP.NET MVC 5应用程序。这里没有自定义代码。

澄清:

如何在登录逻辑中添加一个钩子,以便在用户登录时从WebApi获取令牌?

可能的解决方案:

我做了以下事情:

public class ApplicationSignInManager : SignInManager<ApplicationUser, string>
{
    // Constructor and other code have been hidden to simplify this sample.

    public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
    {
        var status = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);

        if (status == SignInStatus.Success)
        {
            var baseAddress = new Uri(ConfigurationManager.AppSettings["WebApiAddress"]);

            var client = new HttpClient { BaseAddress = baseAddress };
            var response = await client.PostAsync("Token", new StringContent(String.Format("grant_type=password&username={0}&password={1}", userName, password), Encoding.UTF8));

            response.EnsureSuccessStatusCode();

            var tokenResponse = await response.Content.ReadAsStringAsync();
            var json = JObject.Parse(tokenResponse);

            var token = json["access_token"].ToString();
            token.ToString();

            HttpContext.Current.Session["AccessToken"] = token;
        }

        return status;
    }
}

我将重构此代码,以便这成为方法调用。

如果这是一个坏主意,请告诉我。如果有更好的位置,请告诉我。我不喜欢这样。这感觉就像一个黑客,但我不知道还能做什么。

1 个答案:

答案 0 :(得分:0)

在默认模板中,您通过使用用户名,密码和grant_type调用/ token进行身份验证,如下所示:

POST /token HTTP/1.1
Host: yoursite.com
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=something@something.com&password=mypass

这应返回一个令牌,您可以将其设置为连续请求中的标头,以验证您的用户,例如:

GET /api/sms HTTP/1.1
Host: yoursite.com
Authorization: Bearer hegRkzAdXHE-JzAccW-ANpJEyyMU0gBS80ZMxMa1mtpbqGNNtvifMsHVM1O7AinNhIkQuyHbz3wrRcUA0veAC32N8_Oig5f58S6mXiNUbA4y7qLbr4HPyXBQLNq3F29LsnDWJ-cPCivWB13cPeS2en6q39E_ix2CErDDLh-X5i-vmOrK5XgqK1PUlIkyRoA6fvwKKQ3HVrQvNV3D0WSBlIt7i8ykMTnIofAj1_4hpmrQdlLaxq3zfUG9JQbeedUSP5WcjTs1dwdUcJrZWUDrGLHp8bgQ4Av_zx27opx25yyWLOdVsceeth2ytZ0G5vo_m_PCApN9TJGtU70eaYdLa0ZLLIXpG1pDilpGgTeT-bp1qhA8LqKxtXkH54X_o8GlOstoT6NjeyEBG80ZjmHZS_dMn_Uve-qKDGdKPM4JuvBRU2Cqt2M5FiUdGsDjdkOxFVb4xwfAaz0QbwmOAz7xIywIszfEw3blg4eQLefPBAM
Cache-Control: no-cache