.net-core中间件返回空白结果

时间:2017-08-15 19:49:17

标签: c# asp.net-core middleware

我正在建立一个带有API的网站,API需要验证,因此用户只能获取自己的数据。我编写了以下中间件来验证登录。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

        app.UseIdentity();
        app.UseWhen(x => (x.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase)),
            builder =>
            {
                builder.UseMiddleware<ApiAuthenticationMiddleware>();
            });
        app.UseStaticFiles();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

我想要的是,如果用户没有有效登录,则会显示空白页或“无效用户密钥”之类的错误消息。然而,目前发生的是返回主页(因为我的中间件在usemvc之前调用,而return语句跳过usemvc完成的控制器请求)。

我在startup.cs中的configure方法中的相关代码

 context.Response.StatusCode = 401; //UnAuthorized

如何让我的中间件返回带有状态代码的空白页?

请解释下注的原因,以便我可以改进问题并知道我做错了什么。

更新

在尝试了很多事情后,我发现当我删除时:

await context.Response.WriteAsync("Invalid User Key"); 

按预期工作,用户获取以下内容给出的消息:

<?php
    $servername = "127.0.0.1";
    $username = "root";
    $password = "";
    $dbname = "website";

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    try {
    $dbh = new PDO('mysql:host=127.0.0.1;dbname=website', $username, $password);

    /*$stmt = $dbh->prepare('SELECT * FROM USERS WHERE Username = :name');
    $stmt->bindParam(':name', $name, PDO::PARAM_STR, 24);
    $name = "andrei";

    $stmt->execute();

    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    print_r($result['Username']);

    $dbh = null;*/
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
?>

Howerver我不希望用户在登录失败时获得200状态代码但是401状态代码。但是当使用状态代码行时,用户被重定向。那么如何在没有重定向的情况下发送状态码呢?

3 个答案:

答案 0 :(得分:2)

我预感app.UseIdentity()具有默认行为,当403/401发生时,它将拦截响应并启动重定向。尝试对其进行评论,看看它是否有效。

替代解决方案请参阅:https://stackoverflow.com/a/43456151/3948882

最后评论:我强烈建议不要为每个请求传递凭据。我建议使用预构建的auth提供程序并将其作为中间件实现。 Authorize属性应该足以满足请求,并且可以执行您要查找的内容。如果你想要返回一些特殊内容,你可以使用中间件来覆盖响应,例如app.UseIdentity()中间件可能会重定向。

答案 1 :(得分:2)

在设置StatusCode之前尝试使用.Clear()。

<?php

if(isset($_POST['search']))
{
$valueToSearch = $_POST['valueToSearch'];
// search in all table columns
// using concat mysql function
$query = "SELECT * FROM `users` WHERE CONCAT(`id`, `fname`, `lname`, `age`)     LIKE '%".$valueToSearch."%'";
$search_result = filterTable($query);

}
else {
$query = "SELECT * FROM `users`";
$search_result = filterTable($query);
}

// function to connect and execute the query
function filterTable($query)
{
$connect = mysqli_connect("localhost", "root", "", "test_db");
$filter_Result = mysqli_query($connect, $query);
return $filter_Result;
}

?>

<!DOCTYPE html>
<html>
<head>
    <title>PHP HTML TABLE DATA SEARCH</title>
    <style>
        table,tr,th,td
        {
            border: 1px solid black;
        }
    </style>
</head>
<body>

    <form action="php_html_table_data_filter.php" method="post">
        <input type="text" name="valueToSearch" placeholder="Value To Search"><br><br>
        <input type="submit" name="search" value="Filter"><br><br>
        <?php
         if($result_validation != ''){
         ?>
        <table>
            <tr>
                <th>Id</th>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Age</th>
            </tr>

  <!-- populate table from mysql database -->
            <?php while($row = mysqli_fetch_array($search_result)):?>
            <tr>
                <td><?php echo $row['id'];?></td>
                <td><?php echo $row['fname'];?></td>
                <td><?php echo $row['lname'];?></td>
                <td><?php echo $row['age'];?></td>
            </tr>
            <?php endwhile;?>
        </table>
         <?php
         }else{
         echo "no data matched";
         }
         ?>
    </form>

</body>
</html>

答案 2 :(得分:0)

还应该设置ContentType。 像这样:

        context.Response.ContentType = "text/plain";
        context.Response.StatusCode = 401; //UnAuthorized
        await context.Response.WriteAsync("Invalid User Key");