Web API中的ASP.NET标识

时间:2013-10-11 19:47:33

标签: asp.net razor asp.net-web-api asp.net-identity

我正在开发一个使用新ASP.NET身份验证的简单应用程序。由于我计划将来有一个移动应用程序,我已将身份验证放在Web API中,我从Razor Web Page(没有MVC或Forms)发布到jQuery。到目前为止,post工作正常并创建用户并将其记录在API端。

但是,我无法确定如何从那里开始。我需要设置IsAuthenticated,以便我可以提供正确的页面,但它总是返回false。由于Identity是非常新的,因此几乎没有可用的文档,我无法找到任何像从Web API运行它的复杂程序。

问:登录后在Web API中从身份验证返回的正确方法是什么,以便正确设置User.Identity.IsAuthenticated

Login.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>

登录Web API

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)
        {
            //???
        }
    }
}

2 个答案:

答案 0 :(得分:14)

这取决于您使用的身份验证方法。大多数Web应用程序使用Form(Cookie)身份验证模块作为主要身份验证方法。它应该适用于您的网页,但如果您想在本机客户端(如移动应用)上使用您的API,则它不是最佳选择。使用web api启用cookie身份验证时,应该注意CSRF攻击。

假设您正在使用cookie身份验证,您仍有两个选择。一个是FormsAuthentication IIS模块,它已经很老了,您应该使用FormsAuthentication.SetAuthCookie来登录用户。

另一种方式是OWIN cookie middleware,它在默认的MVC 5模板中用于支持身份验证。请查看my answer有关如何通过OWIN API登录用户的信息

如果您想为移动应用的Web API提供更好的身份验证故事,我建议您使用OWIN OAuth middleware启用持票人令牌作为web api的主要身份验证方法。在MVC 5 SPA模板中,它演示了将它们与MVC和cookie auth一起使用的良好模式。我的博客Understanding Security Features in the SPA Template for VS2013 RC应该就他们如何一起工作提供一个大概的了解。

身份框架有OWIN package,它实现了大多数OWIN身份验证代码。所以你不需要实现自己的。为什么不使用它?

答案 1 :(得分:1)

建立Hongye Sun's answer,正确的方法是使用OWIN cookie中间件来传输和存储cookie。实现此目的的正确方法是将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();
        }
    }
}

有关详细信息(包括外部身份验证)的详细说明,请参阅Hongye Sun对this question的回答。