如何在C# Minimal API中获取POST请求的登录名与密码参数?
解决Minimal API获取登录表单输入的问题
首先要修正登录表单的关键问题:你的HTML表单里的输入框没有name属性,表单提交时不会携带参数名,后端无法识别对应字段。先修改GetLogin.cs里的表单:
string html = $"""" <html> <head> <title>Login</title> </head> <body> <form action="/login?returnurl={HttpUtility.UrlEncode(returnUrl)}" method="post"> <!-- 添加name属性,后端将通过该名称识别字段 --> <input value="YourLoginName" type="text" name="username"/><br> <input value="YourPassword" type="password" name="password"/><br> <input value="Submit" type="submit"/> </form> </body> </html> """";
另外,Program.cs里重复调用了builder.Services.AddAuthentication(),保留第一个带"cookie"参数的配置即可,删掉多余的builder.Services.AddAuthentication();行。
接下来提供三种在PostLogin.cs里获取用户名和密码的方法:
方法1:模型绑定(推荐)
创建登录请求模型,通过[FromForm]自动绑定表单数据:
// 定义表单绑定模型 namespace Server.EndPoints { public class LoginRequest { public string Username { get; set; } public string Password { get; set; } } public static class PostLogin { public static async Task<IResult> Handler([FromForm] LoginRequest loginRequest, string returnUrl) { // 直接使用模型属性 var username = loginRequest.Username; var password = loginRequest.Password; // 此处添加用户验证逻辑... return Results.Redirect(returnUrl ?? "/"); } } }
方法2:直接绑定单个表单参数
无需创建模型,直接在方法参数里通过[FromForm]绑定字段:
namespace Server.EndPoints { public static class PostLogin { public static async Task<IResult> Handler([FromForm] string username, [FromForm] string password, string returnUrl) { // 直接使用参数变量 // 验证逻辑... return Results.Redirect(returnUrl ?? "/"); } } }
方法3:从HttpContext手动读取
如果需要底层操作,可直接从请求表单集合中读取:
namespace Server.EndPoints { public static class PostLogin { public static async Task<IResult> Handler(HttpContext context, string returnUrl) { // 安全读取表单字段,避免空引用 var username = context.Request.Form.TryGetValue("username", out var userVal) ? userVal.ToString() : string.Empty; var password = context.Request.Form.TryGetValue("password", out var pwdVal) ? pwdVal.ToString() : string.Empty; // 验证逻辑... return Results.Redirect(returnUrl ?? "/"); } } }
内容的提问来源于stack exchange,提问作者Onno
相关产品推荐
相关产品推荐

