Angular2从asp.net核心应用程序调用facebook登录api

时间:2017-05-11 08:32:43

标签: asp.net facebook angular

在我的ASP.NET核心应用程序中,我已经登录了facebook,工作正常。在我的控制器中,有两种方法可以登录facebook

public IActionResult ExternalLogin(string provider, string returnUrl)
public async Task<IActionResult> ExternalLoginCallback(string returnUrl, string remoteError = null)

ExternalLogin向facebook发出请求并打开批准页面。当我在批准页面中单击“继续”时,将调用ExternalLoginCallback。

现在问题是我对这两个动作进行了api调用,并且我在Angular2应用程序中使用它们。

因此,当我在angular2应用程序中单击facebook登录按钮时,我的ExternalLogin操作被调用并返回成功响应,因为打开了facebook批准页面,但现在我无法从自动调用的ExternalLoginCallback获取ant响应。我怎样才能在我的facebookLogin方法中获得想要的响应???

[HttpPost]
[AllowAnonymous]
public IActionResult ExternalLogin(string provider, string returnUrl)
{
    // Request a redirect to the external login provider.
    var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "User", new { ReturnUrl = returnUrl });
    var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
    return Challenge(properties, provider);
}

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl, string remoteError = null)
{
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (!string.IsNullOrEmpty(remoteError))
    {
        return new StatusCodeResult(401);
    }
    if (info == null)
    {
        return new StatusCodeResult(401);
    }

    // Sign in the user with this external login provider if the user already has a login.
    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false, true);
    if (result.Succeeded)
    {
        return new StatusCodeResult(200);
    }

    //Register with facebook
    var email = info.Principal.FindFirstValue(ClaimTypes.Email);
    if (string.IsNullOrEmpty(email))
    {
        return new StatusCodeResult(401);
    }
    var user = new User
    {
        UserName = email,
        Email = email
    };
    var createResult = await _userManager.CreateAsync(user);
    if (createResult.Succeeded)
    {
        createResult = await _userManager.AddLoginAsync(_userManager.Users.First(m => m.Email == user.Email), info);
        if (createResult.Succeeded)
        {
            await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false, true);
            return new StatusCodeResult(200);
        }
    }

    return new StatusCodeResult(401);
}

这是订阅api调用的打字稿方法:

facebookLogin(provider: string, returnUrl: string) {
    this.productService.externalLogin(provider, returnUrl).subscribe(x => {
        console.log(x);

    },
    error => {
    });
}

这是我的api电话:

public externalLogin(provider: string, returnUrl: string) {
    var url = 'http://mywebsite.com/api/User/ExternalLogin?Provider=Facebook&ReturnUrl=%2F';

    return this.http.post(url, `Provider=${provider}&ReturnUrl=${returnUrl}`);
}

0 个答案:

没有答案