如何从.Net Core [Authorize]方法返回身份验证令牌

时间:2020-10-29 03:25:48

标签: c# asp.net-core jwt openid-connect

我的主应用程序将身份验证委托给AuthService应用程序,要求它通过OpenId Connect对身份提供者进行身份验证并返回令牌。

    [Authorize]
    [HttpGet("Login")]
    public IActionResult Login()
    {
        return Ok(
        {
            Token = ?
        }, OpenIdConnectDefaults.AuthenticationScheme);
    }

我有一个具有[Authorize]属性的API方法。如果尚未通过身份验证,则提示用户登录,然后该方法运行。我的问题是我可以从那里访问令牌,以便在响应中传递它吗?

有没有简单的方法可以实现这一目标?

4 个答案:

答案 0 :(得分:0)

您可以获得在控制器中注入IHttpContextAccessor服务并在startup.cs类中定义服务的信息

public class HomeController
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public HomeController(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        //check the _httpContextAccessor.HttpContext object for information about the already logged user
    }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

答案 1 :(得分:0)

您在方法上设置的[Authorize]属性意味着您仅将方法访问权限限制为授权用户,因此将该属性放在Login方法上是没有意义的,因为必须对其进行身份验证才能调用它

您正在寻找的是

[Authorize]
public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult Login()
    {
    }
    [Authorize]
    public ActionResult Logout()
    {
    }
}

关于如何生成令牌,您需要有一个身份提供者来获取用户名和密码,对其进行验证并创建具有角色和privs的令牌。

我建议您看看Identity Server 4来生成令牌。

有关如何将其连接到OpenID的信息,请参见Adding User Authentication with OpenID Connect

答案 2 :(得分:0)

您必须获取令牌才能访问Authorize属性方法。

参考 this

答案 3 :(得分:0)

这是我在查看了这里的建议后想到的:

    [AllowAnonymous]
    [HttpGet("Login")]
    public IActionResult Login()
    {
        return Challenge(new AuthenticationProperties
        {
            RedirectUri = $"{HttpContext.Request.PathBase.Value}/GetToken"
        }, OpenIdConnectDefaults.AuthenticationScheme);
    }

    [Authorize(AuthenticationSchemes = OpenIdConnectDefaults.AuthenticationScheme)]
    [HttpGet("GetToken")]
    public IActionResult GetToken()
    {
        var token = _contextAccessor.HttpContext.GetTokenAsync(OpenIdConnectDefaults.AuthenticationScheme, "id_token").Result;

        return Ok(new
        {
            Token = token
        });
    }

我结合了两个API。从客户端应用程序的角度来看,它调用Login API并获取令牌作为结果。在后台,Login API重定向到另一个API以获取并返回令牌。