我正在建立一个带有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状态代码。但是当使用状态代码行时,用户被重定向。那么如何在没有重定向的情况下发送状态码呢?
答案 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");