Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 如何在ASP.NET Core中将Microsoft帐户外部登录限制为电子邮件列表或一个域_Authentication_Asp.net Core_Login_Asp.net Identity - Fatal编程技术网

Authentication 如何在ASP.NET Core中将Microsoft帐户外部登录限制为电子邮件列表或一个域

Authentication 如何在ASP.NET Core中将Microsoft帐户外部登录限制为电子邮件列表或一个域,authentication,asp.net-core,login,asp.net-identity,Authentication,Asp.net Core,Login,Asp.net Identity,我有一个web应用程序,用于列出使用Outlook作为电子邮件提供商的用户。该web应用程序使用Microsofts外部登录api。但是任何拥有Microsoft电子邮件帐户的人现在都可以登录 我假设这是Microsoft dev portal中的应用程序设置,或者是代码中的覆盖。如何筛选应用程序的域或拥有可登录帐户的严格列表?好的,门户没有控制该设置,因此解决方法可能是在从Microsoft的登录页面重定向回客户端后限制帐户类型 我假设您使用的是Microsoft.AspNetCore.Aut

我有一个web应用程序,用于列出使用Outlook作为电子邮件提供商的用户。该web应用程序使用Microsofts外部登录api。但是任何拥有Microsoft电子邮件帐户的人现在都可以登录


我假设这是Microsoft dev portal中的应用程序设置,或者是代码中的覆盖。如何筛选应用程序的域或拥有可登录帐户的严格列表?

好的,门户没有控制该设置,因此解决方法可能是在从Microsoft的登录页面重定向回客户端后限制帐户类型

我假设您使用的是
Microsoft.AspNetCore.Authentication.MicrosoftAccount

您可以在ASP.NET Identity的
ExternalLoginCallback
功能中检查电子邮件帐户是否为outlook帐户:

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
    if (remoteError != null)
    {
        ErrorMessage = $"Error from external provider: {remoteError}";
        return RedirectToAction(nameof(Login));
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();

    var emailAddress = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email).Value;

    //Check whether this is outlook account .
    if (!"outlook.com".Equals(emailAddress.Split('@')[1]))
    {
        //return to error page and show error message 
    }
    if (info == null)
    {
        return RedirectToAction(nameof(Login));
    }


    // 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, isPersistent: false, bypassTwoFactor: true);
    if (result.Succeeded)
    {
        _logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
        return RedirectToLocal(returnUrl);
    }
    if (result.IsLockedOut)
    {
        return RedirectToAction(nameof(Lockout));
    }
    else
    {
        // If the user does not have an account, then ask the user to create an account.
        ViewData["ReturnUrl"] = returnUrl;
        ViewData["LoginProvider"] = info.LoginProvider;
        var email = info.Principal.FindFirstValue(ClaimTypes.Email);
        return View("ExternalLogin", new ExternalLoginViewModel { Email = email });
    }
}
更新:

如果您正在使用
个人用户帐户
模板创建.net核心应用程序,这意味着您正在使用ASP.net标识:

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
    if (remoteError != null)
    {
        ErrorMessage = $"Error from external provider: {remoteError}";
        return RedirectToAction(nameof(Login));
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();

    var emailAddress = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email).Value;

    //Check whether this is outlook account .
    if (!"outlook.com".Equals(emailAddress.Split('@')[1]))
    {
        //return to error page and show error message 
    }
    if (info == null)
    {
        return RedirectToAction(nameof(Login));
    }


    // 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, isPersistent: false, bypassTwoFactor: true);
    if (result.Succeeded)
    {
        _logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
        return RedirectToLocal(returnUrl);
    }
    if (result.IsLockedOut)
    {
        return RedirectToAction(nameof(Lockout));
    }
    else
    {
        // If the user does not have an account, then ask the user to create an account.
        ViewData["ReturnUrl"] = returnUrl;
        ViewData["LoginProvider"] = info.LoginProvider;
        var email = info.Principal.FindFirstValue(ClaimTypes.Email);
        return View("ExternalLogin", new ExternalLoginViewModel { Email = email });
    }
}


ASP.NET Core 2.1及更高版本将ASP.NET Core标识作为Razor类库提供。您可以修改代码并更改行为。或者您可以尝试上面的第二种解决方案来修改OpenID Connect中间件。

A好的,portal没有控制该中间件的设置,因此解决方法可能是在从Microsoft的登录页重定向回您的客户端后限制帐户类型。@Nayu我对.net是全新的。发生重定向时调用什么?我可以在setup.cs中进行一些重写吗?或者它将是该覆盖的每页/视图句柄。谢谢你,这个答案很有意思。让我看一下,然后再报告。Cheesi已在基本控制器中实现了
ExternalLoginCallback
。所有其他控制器都从中继承。这是一种覆盖,还是我必须进入Microsoft开发应用程序并指定
ExternalLoginCallback
作为回调方法?不,ExternalLoginCallback是asp.net identity自动为您创建的操作。是否使用asp.net标识?请参阅编辑的回复。您可以在ASP.NET核心项目中构建身份,也可以尝试第二种解决方案
然后如何完全结束会话/创建会话的过程。
恐怕您不能,因此这是一种解决方法。但您的用户将看到他的帐户在您的应用程序中没有经过身份验证,因为您将重定向到另一个页面,所以identity system将不会验证/解码令牌并登录用户。