gpt4 book ai didi

asp.net-mvc - WebAPI + 表单例份验证 + SimpleMembershipProvider 在不应该使用 WindowsIdentity 时使用

转载 作者:行者123 更新时间:2023-12-02 02:52:23 32 4
gpt4 key购买 nike

我做了什么

我正在构建一个 REST-ish WebAPI 应用程序。我试图在这里实现表单例份验证,以便客户端可以允许用户从浏览器登录/注册/注销。我正在使用 simpleMembership,用户存储在我的应用程序的 simpleMembership 数据库表中。第一步,我在 AccountsController 中实现了登录方法:

    [System.Web.Http.HttpPost]
public HttpResponseMessage LogIn(LoginModel model)
{
if (ModelState.IsValid)
{
if (User.Identity.IsAuthenticated)
{
return Request.CreateResponse(HttpStatusCode.Conflict, "already logged in.");
}
if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
//TODO: look up by id, not by name
var userProfile = _service.GetUser(WebSecurity.GetUserId(model.UserName));
return Request.CreateResponse(HttpStatusCode.OK, userProfile);
}
else
{
return new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}

// If we got this far, something failed
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
}

问题

这是发生的事情:

  1. 我在 if (User.Identity.IsAuthenticated) 处设置了断点。
  2. 使用 POSTMan 或 Fiddler 之类的工具,我尝试使用一些虚假凭据登录。
  3. 正如预期的那样,我遇到了断点,并且 IsAuthenticated 得到“False”。
  4. 我跳到下一个“如果”,并且尝试登录失败,正如预期的那样。
  5. else 语句中的代码被命中,但一旦返回,1) 我的断点再次被命中,2) 主体被设置为我的 Windows 身份。两者都是出乎意料的,我正在尝试找出如何纠正它。

enter image description here

预期行为

  • 该方法仅返回 401 Unauthorized,因为我的应用数据库中不存在虚假用户。

配置

认为这是一个配置问题 - 在身份验证失败时,由于某种原因,主体会自动设置为我的 Windows 帐户。与我的配置相关的一些详细信息:

<authentication mode="Forms">
<forms loginUrl="~/" timeout="2880" />
</authentication>
  • 我没有在应用程序的任何地方启用 Windows 身份验证。我的 web.config 位于上面 ^
  • 使用 IISManager 我已禁用匿名身份验证
  • 在我的 applicationhost.config 中,我禁用了 Windows 和匿名身份验证

问题

  1. 为什么断点被击中两次,而不是 LogIn 方法在击中最后一个“else”后仅返回 Unauthorized?
  2. 为什么我的 Windows 凭据会被用于这种意外且不需要的“环回”?
  3. 如何防止这种情况发生?或:
  4. 我需要使用 MessageHandler 来设置主体吗?如果是,这对 [Authenticate] 和 IsAuthenticated 有什么影响?有什么例子吗?

更新1

我尝试注册以下处理程序:

public class PrincipalHandler : DelegatingHandler
{

protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
System.Threading.CancellationToken
cancellationToken)
{
HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);
Thread.CurrentPrincipal = HttpContext.Current.User;
return await base.SendAsync(request, cancellationToken);
}

}

现在主体从未设置为我的 Windows 身份。从 POSTMan(浏览器扩展)中,if 语句被点击两次,我收到一个弹出窗口,要求提供凭据。正如预期的那样,从 Fiddler 中,我刚刚收到 401 Unauthorized。

新问题

  1. 如何根据响应 cookie 中的内容设置主体,并根据应用程序的简单成员资格表进行身份验证?

更新2

这篇文章似乎让我朝着正确的方向前进 - 在我的 LoginMethod 中使用 Membership 而不是 User:

ASP.NET MVC - Set custom IIdentity or IPrincipal

将继续随着进度进行更新,但我仍然愿意接受建议/推荐。

更新3我从来没有像现在这样既松了一口气又生气了——这里不需要自定义处理程序。我的项目属性中启用了 Windows 身份验证。登录和注销的工作解决方案在这里,并且“只需使用”我的成员(member)表即可:

public HttpResponseMessage LogIn(LoginModel model)
{
if (ModelState.IsValid)
{
if (User.Identity.IsAuthenticated)
{
return Request.CreateResponse(HttpStatusCode.Conflict, "already logged in.");
}
if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return Request.CreateResponse(HttpStatusCode.OK, "logged in successfully");
}
else
{
return new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}

// If we got this far, something failed
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
}

public HttpResponseMessage LogOut()
{
if (User.Identity.IsAuthenticated)
{
WebSecurity.Logout();
return Request.CreateResponse(HttpStatusCode.OK, "logged out successfully.");
}
return Request.CreateResponse(HttpStatusCode.Conflict, "already done.");
}

最佳答案

您是否使用 IIS Express 进行开发?如果是这样,请在 Visual Studio 中单击您的项目并检查属性窗口。这里有一个 Windows 身份验证选项,我相信默认情况下是启用的。也在这里禁用它。

关于asp.net-mvc - WebAPI + 表单例份验证 + SimpleMembershipProvider 在不应该使用 WindowsIdentity 时使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15994857/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com