我正在开发一个简单的应用程序,该应用程序使用新的 ASP.NET 身份进行身份验证。由于我计划将来有一个移动应用程序,我已将身份验证放在Web API中,我从Razor网页(没有MVC或Forms)从jQuery发布到该API中。到目前为止,post工作正常,可以在API端创建用户并登录。
但是,我无法确定如何从那里开始。我需要设置 IsAuthentication,以便我可以提供正确的页面,但它总是返回 false。由于 Identity 是非常新的,因此可用的文档很少,我无法找到像从 Web API 运行它这样复杂的东西。
问:登录后从 Web API 中的身份验证返回以正确设置User.Identity.IsAuthenticated
的正确方法是什么?
登录.cshtml
@if (User.Identity.IsAuthenticated)
{
@RenderPage("/userpage.cshtml");
}
else
{
<form id="loginForm">
<b>Login</b>
<input type="email" placeholder="Email" name="email" id="loginEmail" />
<input type="password" placeholder="Password" name="password" id="loginPassword" />
<input type="submit" value="Log In"/>
</form>
}
<script>
$("#loginForm").submit(function(event)
{
event.preventDefault();
$.post("/api/login/",
{
Username: $('#loginEmail').val(),
Password: $('#loginPassword').val()
}, function ()
{
//???
}, "json");
return false;
});
</script>
登录网页接口
public class LoginController : ApiController
{
public async void Post(UserInfo info)
{
var manager = new AuthenticationIdentityManager(new IdentityStore());
var result = await manager.Authentication.CheckPasswordAndSignInAsync(HttpContext.Current.GetOwinContext().Authentication, info.Username, info.Password, true);
if (result.Success)
{
//???
}
}
}
这取决于您使用的身份验证方法。大多数 Web 应用程序使用表单 (Cookie) 身份验证模块作为主要身份验证方法。它应该可以很好地处理您的网页,但如果您想在本机客户端(如移动应用程序)上使用您的 API,则它不是最佳选择。在使用 Web API 启用 cookie 身份验证时,您应该小心 CSRF 攻击。
假设您使用的是 cookie 身份验证,您仍然有两个选择。一个是FormsAuthentication IIS模块,它已经很老了,你应该使用FormsAuthentication.SetAuthCookie来登录用户。
另一种方式是 OWIN cookie 中间件,它在默认的 MVC 5 模板中用于支持身份验证。请检查我关于如何通过 OWIN API 登录用户的答案
如果你想为带有移动应用的 Web API 提供更好的身份验证故事,我建议你使用 OWIN OAuth 中间件启用持有者令牌作为 Web API 的主要身份验证方法。在 MVC 5 SPA 模板中,它演示了将它们与 MVC 和 cookie 身份验证一起使用的良好模式。我的博客了解VS2013 RC的SPA模板中的安全功能应该可以大致了解它们如何协同工作。
标识框架有一个 OWIN 包,该包实现大多数 OWIN 身份验证代码。因此,您不需要实现自己的。为什么不使用它?
基于孙宏业的回答,正确的方法是使用OWIN饼干中间件来传输和存储饼干。实现此目的的正确方法是将 Startup.cs 添加到项目根目录并包含以下内容(这在 VS 提供的启动模板中可用)。Web API 响应将自动发送 Cookie。
using Microsoft.AspNet.Identity.Owin;
[assembly: OwinStartup(typeof(MyApp.Startup))]
namespace MyApp
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseSignInCookies();
}
}
}
有关更多详细信息的完整解释,包括外部身份验证,请参阅孙宏业对此问题的回答。