【问题标题】:How to build a WebAPI for remote authentication?如何构建用于远程身份验证的 Web API?
【发布时间】:2012-05-18 09:38:51
【问题描述】:

我们正在考虑将现有的成员资格提供程序修改为 Web 服务以允许远程身份验证。比如说,Windows 8 应用程序将能够接受登录凭据并在我们服务器上的数据库中检查它。

---更新---

我们查看了asp.net网站上的视频(Authorization,但发现它仍然使用传统的控制器来完成认证/授权任务。视频仅显示我们可以使用[Authorize]属性。是有没有办法使用 ApiController 以便将身份验证公开为 Web 服务以供其他应用程序使用?

---我的更新结束---

我一直在尝试寻找一些示例代码/项目,但目前没有找到。任何人都可以提出解决方案吗?

谢谢。

【问题讨论】:

  • 你真的一直在喝微软的 Kool-Aid,不是吗;)?是的,Windows 8 很酷。我自己一直在玩它。我绝对鼓励您使用它,并使用 Metro UI。但就服务器端而言:K.I.S.S.!!!!!! 忘记框架-du-jour,并以您所知道的和您今天正在使用的内容为基础。甚至就客户端而言:请考虑替代框架,例如 PhoneGap。恕我直言...
  • 好吧,不一定适用于 Windows 8。这些天我一直在使用 MVC4 WebApi。但是没有现有的示例向我展示如何使用 ApiController 进行身份验证。我会更新我的问题。
  • 嗨 - 很公平。这些链接可能会有所帮助:stackoverflow.com/questions/9482982/…netmvc.blogspot.com/2012/03/…
  • 另一个包含一些有趣内容的链接:weblogs.asp.net/scottgu/archive/2012/02/23/…

标签: authentication asp.net-membership asp.net-mvc-4 asp.net-web-api


【解决方案1】:

这是我通过 WebAPI 进行身份验证的方式 - 它使用 Forms Auth 和 SimpleMembershipProvider。我不是经验丰富的编码员,因此这可能与质量相差甚远,但它应该可以帮助您入门。请注意,这只是验证用户,而不是客户端(api 密钥实现对我来说是一个 TODO)。欢迎反馈。

检查当前客户端/用户是否已通过身份验证:

public class AccountController : ApiController
{
    public static DtoService _service = new DtoService();

    // GET/api/isAuthenticated
    [System.Web.Http.HttpGet]
    public HttpResponseMessage IsAuthenticated()
    {
        try
        {
            if (User.Identity.IsAuthenticated)
                return Request.CreateResponse(HttpStatusCode.OK, WebSecurity.GetUserId(User.Identity.Name));
            else
                return Request.CreateResponse(HttpStatusCode.OK, false);
        }
        catch (Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }

    }

登录:

    // POST /api/login
    // [System.Web.Http.AllowAnonymous]
    [System.Web.Http.HttpPost]
    public HttpResponseMessage LogIn(LoginModel model)
    {
        if (!ModelState.IsValid)
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        try
        {
            if (User.Identity.IsAuthenticated)
                return Request.CreateResponse(HttpStatusCode.Conflict, "already logged in.");
            if (!WebSecurity.UserExists(model.UserName))
                return Request.CreateResponse(HttpStatusCode.BadRequest, "User does not exist.");
            if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return Request.CreateResponse(HttpStatusCode.OK, "logged in successfully");
            }
            return Request.CreateResponse(HttpStatusCode.BadRequest, "Login Failed.");
        }
        catch (Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }
    }

退出:

    // POST /api/logout
    [System.Web.Http.HttpPost]
    ////[ValidateAntiForgeryToken]
    [Authorize]
    public HttpResponseMessage LogOut()
    {
        try
        {
            if (User.Identity.IsAuthenticated)
            {
                WebSecurity.Logout();
                return Request.CreateResponse(HttpStatusCode.OK, "logged out successfully.");
            }
            return Request.CreateResponse(HttpStatusCode.Conflict, "already done.");
        }
        catch (Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }
    }

注册:

    // POST: /api/register
    [System.Web.Http.HttpPost]
    //[ValidateAntiForgeryToken]
    public HttpResponseMessage Register(RegisterModel model)
    {
        if (!ModelState.IsValid)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
        try
        {
            if (User.Identity.IsAuthenticated)
                return Request.CreateResponse(HttpStatusCode.Conflict, "User Already Registered and Logged In");
            if (WebSecurity.UserExists(model.UserName))
                return Request.CreateResponse(HttpStatusCode.Conflict, "User Already Registered");
            else
            {
                // Attempt to register the user
                WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
                WebSecurity.Login(model.UserName, model.Password);
                InitiateDatabaseForNewUser(WebSecurity.GetUserId(model.UserName));

                FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie: false);
                return Request.CreateResponse(HttpStatusCode.Created, WebSecurity.GetUserId(model.UserName));
            }

        }
        catch (Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }

    }
}

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2015-05-27
    • 2013-11-19
    • 2011-08-15
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2017-07-03
    • 2014-05-28
    相关资源
    最近更新 更多