如何从 .Net Core [Authorize] 方法 return 授权令牌
How to return auth Token from .Net Core [Authorize] method
我的主应用程序将身份验证委托给 AuthService 应用程序,要求它通过 OpenId Connect 和 return 令牌对身份提供者进行身份验证。
[Authorize]
[HttpGet("Login")]
public IActionResult Login()
{
return Ok(
{
Token = ?
}, OpenIdConnectDefaults.AuthenticationScheme);
}
我有一个带有 [Authorize]
属性的 API 方法。如果尚未通过身份验证,系统会提示用户登录,然后该方法将运行。我的问题是我可以从那里访问令牌以便在响应中传递它吗?
有没有简单的方法可以做到这一点?
您可以通过在控制器中注入 IHttpContextAccessor
服务并在 startup.cs class
中定义服务来获取该信息
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>();
}
您在方法上设置的 [Authorize] 属性意味着您将访问该方法的权限仅限于授权用户,因此在登录方法上设置该属性没有任何意义,因为您必须通过身份验证才能叫它。
你要找的是
[Authorize]
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult Login()
{
}
[Authorize]
public ActionResult Logout()
{
}
}
至于如何生成令牌,您需要有一个身份提供者来获取用户名和密码,对其进行验证并创建一个具有角色和权限的令牌。
我建议查看 Identity Server 4 以生成令牌。
有关如何将其连接到 OpenID 的信息,请参阅 Adding User Authentication with OpenID Connect
您必须获得令牌才能访问授权属性方法。
参考
this
这是我在查看此处的建议后得出的结论:
[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。从客户端应用程序的角度来看,它调用登录 API 并获取令牌作为结果。在后台登录 API 重定向到第二个 API 以获取和 return 令牌。
更新:
过段时间重温以防有人看到。我不记得具体如何,但我认为上述方法对我来说有问题。
最后,我使用 OnSignedIn
CookieAuthenticationHandler
事件拦截令牌,并 return 使用 Cookie 中的响应对其进行编辑。登录 API 仍然是 return 一个 Challenge
请求。
我的主应用程序将身份验证委托给 AuthService 应用程序,要求它通过 OpenId Connect 和 return 令牌对身份提供者进行身份验证。
[Authorize]
[HttpGet("Login")]
public IActionResult Login()
{
return Ok(
{
Token = ?
}, OpenIdConnectDefaults.AuthenticationScheme);
}
我有一个带有 [Authorize]
属性的 API 方法。如果尚未通过身份验证,系统会提示用户登录,然后该方法将运行。我的问题是我可以从那里访问令牌以便在响应中传递它吗?
有没有简单的方法可以做到这一点?
您可以通过在控制器中注入 IHttpContextAccessor
服务并在 startup.cs class
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>();
}
您在方法上设置的 [Authorize] 属性意味着您将访问该方法的权限仅限于授权用户,因此在登录方法上设置该属性没有任何意义,因为您必须通过身份验证才能叫它。
你要找的是
[Authorize]
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult Login()
{
}
[Authorize]
public ActionResult Logout()
{
}
}
至于如何生成令牌,您需要有一个身份提供者来获取用户名和密码,对其进行验证并创建一个具有角色和权限的令牌。
我建议查看 Identity Server 4 以生成令牌。
有关如何将其连接到 OpenID 的信息,请参阅 Adding User Authentication with OpenID Connect
您必须获得令牌才能访问授权属性方法。
参考 this
这是我在查看此处的建议后得出的结论:
[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。从客户端应用程序的角度来看,它调用登录 API 并获取令牌作为结果。在后台登录 API 重定向到第二个 API 以获取和 return 令牌。
更新:
过段时间重温以防有人看到。我不记得具体如何,但我认为上述方法对我来说有问题。
最后,我使用 OnSignedIn
CookieAuthenticationHandler
事件拦截令牌,并 return 使用 Cookie 中的响应对其进行编辑。登录 API 仍然是 return 一个 Challenge
请求。