- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了什么
我正在构建一个 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);
}
问题
这是发生的事情:
if (User.Identity.IsAuthenticated)
处设置了断点。else
语句中的代码被命中,但一旦返回,1) 我的断点再次被命中,2) 主体被设置为我的 Windows 身份。两者都是出乎意料的,我正在尝试找出如何纠正它。
预期行为
配置
我认为这是一个配置问题 - 在身份验证失败时,由于某种原因,主体会自动设置为我的 Windows 帐户。与我的配置相关的一些详细信息:
<authentication mode="Forms">
<forms loginUrl="~/" timeout="2880" />
</authentication>
问题
更新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。
新问题
更新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/
我正在尝试检查Powerhell脚本是否以管理员身份运行。 在网上搜索后,我得到了一些运行良好的示例代码。 为了获得WindowsPrincipal对象,我发现了以下两个示例代码。 第一: New-O
我正在尝试使用 SID-s 检查用户是否属于某些组。 我正在使用 WindowsIdentity.Groups ,但后来注意到有时它不显示用户属于管理员组。 搜索了一段时间后,我发现不是Windows
我试图拦截 WindowsAuthenticationModule 以另一个用户身份登录到应用程序,但我无法在不知道他的密码的情况下创建新的 WindowsIdentity。该代码将在管理员权限下运行
我正在开发具有以下详细信息的客户端服务器应用程序: Client(C++) -----------HTTPS--- Server (C#/WCF) 服务器: 与 Windows Active
当我像这样使用 WindowsIdentity 模拟时: WindowsIdentity newId = null; WindowsImpersonationContext impe
我正在构建一个站点,该站点使用当前用户的 WindowsIdentity 获取用户信息。我从中获得的主要信息是 ssid。 我按如下方式为当前用户执行此操作 IntPtr logonToken = W
ServiceSecurityContext 为何包含 WindowsIdentity 属性? 即,如果用户使用 Windows 身份验证机制进行身份验证,则 ServiceSecurityConte
获取当前用户的用户名和/或 SID 时,首选方法是什么? 是否使用: WindowsIdentity.GetCurrent().Owner 或者: WindowsIdentity.GetCurrent
我正在尝试在我的 WPF 客户端/服务器 (WCF) 应用程序中使用 Windows Identity Foundation 进行授权,该应用程序可能会或可能不会在与提供身份验证的事件目录相同的信任环
我正在一个安全的服务器上运行一个应用程序(我必须远程访问并且必须通过电子邮件将文件发送给某人以便他们将它们放到服务器上,因此更改代码不是一个快速的过程)。 在某一时刻,该服务通过获取登录用户 Oper
我有一个由 IIS 托管的 Web 应用程序。它配置了表单例份验证和匿名身份验证,并且启用了模拟。应用程序池帐户是网络服务。匿名帐户是 Costa。 Costa 可以访问数据库。 NetworkSer
假设我有一个 WindowsIdentity 的实例,并且想要获取它所属的组。我使用以下代码获取列表: WindowsIdentity identity = null; // get iden
我正在使用模拟在连接到域的 Windows 7 计算机上实例化 WindowsIdentity。我通过 Groups 属性取回了很多组。一些域、本地和内置但我没有得到用户所在的内置管理员组。我很困惑为
我正在使用 WindowsIdentity 获取当前用户的 ID 以执行 SSO。在大多数情况下,我得到的正是我想要的,但对于某些用户来说,我得到的结果很奇怪。示例代码: IIdentity WinI
TL;DR WindowsIdentity 的 Token 属性中是否包含用户 token (例如,someIdentity.Token) 被欺骗: var validated = new Windo
我有以下代码: var baseUrl = "https://" + GetIdentityProviderHost(environment) + "/oauth2/authorize"; var q
我正在使用 Windows 身份验证的 ASP.NET 应用程序中。 我正在使用 HttpContext.Current.User.Identity.Name 获取当前经过身份验证的用户的用户名,这会
我有一个安装项目(在 Windows 7 上运行)在提交时启动自定义操作,启动刚刚安装的应用程序。在此应用程序启动期间,我有一个方法可以检查当前用户名以执行某些身份验证。当从此自定义操作启动时,我得到
如何从收到的msmq消息中获取发件人的WindowsIdentity? 我使用 msmq 作为传输和安全应用程序 block ,并使用授权规则提供程序进行操作授权。我需要 WindowsPrincip
我有一个 ASP.NET 网站,它要求我的应用程序池是经典 .Net 应用程序池。该站点在 IIS 7 上的 .NET 3.5 上运行。当我尝试获取已登录用户的 Active Directory 用户
我是一名优秀的程序员,十分优秀!