【发布时间】:2019-05-25 00:28:02
【问题描述】:
我有一个 .Net Core 2.2 Web 应用程序 MVC,我在其中添加了 API 控制器和 SignalR 集线器。另一方面,我有一个调用集线器方法的移动应用程序。在从应用程序调用集线器之前,我通过 API 调用验证我的用户 - 获取 JWT 令牌 - 并将此令牌用于未来的请求,这样我可以在我的集线器方法中使用 Context.User.Identity.Name:
public static async Task<string> GetValidToken(string userName, string password)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_API_BASE_URI);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
LoginViewModel loginVM = new LoginViewModel() { Email = userName, Password = password, RememberMe = false };
var formContent = Newtonsoft.Json.JsonConvert.SerializeObject(loginVM);
var content = new StringContent(formContent, Encoding.UTF8, "application/json");
HttpResponseMessage responseMessage;
try
{
responseMessage = await client.PostAsync("/api/user/authenticate", content);
var responseJson = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); ;
var jObject = JObject.Parse(responseJson);
_TOKEN = jObject.GetValue("token").ToString();
return _TOKEN;
}catch
[...]
然后使用令牌:
_connection = new HubConnectionBuilder().WithUrl(ApiCommunication._API_BASE_URI + "/network", options =>
{
options.AccessTokenProvider = () => Task.FromResult(token);
}).Build();
到目前为止一切顺利。它在我的移动应用程序上按预期工作。但为了让它工作,我不得不在服务器端设置这段代码(Startup.cs):
services.AddAuthentication(options =>
{
options .DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options .DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
...
这使我无法再使用 cookie 身份验证,因此 mvc Web 应用程序不再按预期工作,因为它无法在请求中获取当前经过身份验证的用户。
删除行:
options .DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options .DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
使网络应用程序正常工作,但不再使移动应用程序正常工作(由于Context.User.Identity.Name 等于 null,集线器调用失败)。
我一直在搜索如何处理不同的方案(在我的情况下是 cookie + jwt),据我了解,这在设计上已经不可能了。
是否有任何可能的解决方法来使用双重方案或者我错过了什么?
我想也许我应该托管 2 个单独的项目,并使用一个使用 Cookie 身份验证,另一个使用 JWT?
提前致谢。
【问题讨论】:
-
在 web 应用中实现 jwt auth 有问题吗?
-
DefaultAuthenticateScheme 设置为 JWT 时,Web 应用无法识别用户。
标签: c# authentication asp.net-core-mvc jwt asp.net-core-2.2