繁体   English   中英

无法从Asp.Net Core 2.0中的HTTP标头获取标头值

[英]Can't get the header value from HTTP header in Asp.Net Core 2.0

我有一个MVC控制器,旨在从HTTP标头读取用户的信息。 标头包含从单点登录(SiteMinder)返回的用户信息。 SiteMinder将用户重定向到公司登录页面,并返回我的应用程序以及cookie和HTTP标头。 HTTP标头包含用户的信息。 我的控制器应该获取这些信息并在导航栏中显示。

这是控制器代码:

[HttpGet]
public async Task<IActionResult> GetUser()
{
    var person = Request.Headers["HTTP_JHED_UID"].ToString();
    if (repository.GetJhedUser(person) != null)
    {
        var user = await repository.GetUser(person);
        var userDto = mapper.Map<User, UserForDisplayDto>(user);
        return Ok(userDto);
    }
    else
    {
        return null;
    }

}

这是我对应的存储库:

public string GetJhedUser(string value)
{
    return context.Users.Where(x => x.JHED_ID == value).ToString();
}

public async Task<User> GetUser(string id, bool includeRelated = true)
{
    if(!includeRelated)
        return await context.Users.FindAsync(id);

    return await context.Users
        .SingleOrDefaultAsync(s => s.JHED_ID == id);
}

我收到500服务器错误。 我确信标头有这些值。

编辑:这是一个调试的图像。 即使我尝试使用“日期”,价值也没有。 请注意,我将代码重构为@ Nkosi的代码

在此输入图像描述

如何从标题中获取这些用户的信息(在本例中只是用户名),以便我可以在我的HTML模板中显示?

不要从控制器操作返回null

在尝试访问之前检查标头是否确实存在。

重新构建要进行编码的动作更具防御性。

[HttpGet]
public async Task<IActionResult> GetUser() {
    //was the header provided?
    var headerValue = Request.Headers["HTTP_JHED_UID"];
    if(headerValue.Any() == false) return BadRequest(); //401

    //does the person exist?
    var person = headerValue.ToString();
    if(repository.GetJhedUser(person) == null) return NotFound(); //404

    var user = await repository.GetUser(person);
    var userDto = mapper.Map<User, UserForDisplayDto>(user);
    return Ok(userDto); //200
}

GetJhedUser的存储库代码也存在问题,因为在linq表达式上调用字符串并不是您所做的。

我会进一步建议将GetJhedUser重构为它实际检查的内容

public bool JhedUserExists(string value) {
    return context.Users.FirstOrDefault(x => x.JHED_ID == value) != null;
}

这导致动作看起来像这样

[HttpGet]
public async Task<IActionResult> GetUser() {
    //was the header provided?
    var headerValue = Request.Headers["HTTP_JHED_UID"];
    if(headerValue.Any() == false) return BadRequest(); //401

    //does the person exist?
    var person = headerValue.ToString();
    if(repository.JhedUserExists(person) == false) return NotFound(); //404

    var user = await repository.GetUser(person);
    var userDto = mapper.Map<User, UserForDisplayDto>(user);
    return Ok(userDto); //200
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM