【问题标题】:ASP.NET Identity in a Web APIWeb API 中的 ASP.NET 标识
【发布时间】:2013-10-20 00:02:14
【问题描述】:

我正在开发一个使用新的 ASP.NET Identity 进行身份验证的简单应用程序。由于我计划将来有一个移动应用程序,因此我将身份验证放在了 Web API 中,我从 Razor 网页(没有 MVC 或表单)从 jQuery 发布到该 API。到目前为止,post 工作正常,可以在 API 端创建用户并将其登录。

但是,我无法确定如何从那里开始。我需要设置 IsAuthenticated 以便我可以提供正确的页面,但它总是返回 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>

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

【问题讨论】:

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


【解决方案1】:

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

假设您使用 cookie 身份验证,您仍然有两个选择。一个是FormsAuthentication IIS模块,比较老了,应该用FormsAuthentication.SetAuthCookie来登录用户。

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

如果您想通过移动应用程序为 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 身份验证代码。所以你不需要实现你自己的。为什么不使用它?

【讨论】:

  • 你好宏业,感谢关于 OWIN 安全性的精彩博文。有机会看到 Facebook 在移动应用程序上的集成吗?在 cmets 中您说“示例代码仍在审核中,发布后我将创建一个博客。”:您有任何消息吗?谢谢
  • 可以将 OWIN 身份验证添加到使用 DotNetOpenAuth 的现有 Web 应用程序中吗?
  • Your answer 并没有真正回答这个问题......那个是用于外部登录的。如果我们不想使用外部登录怎么办?
【解决方案2】:

基于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 的回复,了解更多详细信息,包括外部身份验证。

【讨论】:

  • 这个答案不完整...app.UseSignInCookies(); 不是可用的方法...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2018-06-09
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多