Authentication 如何构建用于远程身份验证的WebAPI?

Authentication 如何构建用于远程身份验证的WebAPI?,authentication,asp.net-membership,asp.net-mvc-4,asp.net-web-api,Authentication,Asp.net Membership,Asp.net Mvc 4,Asp.net Web Api,我们正在考虑将现有的成员资格提供商修改为web服务,以允许远程身份验证。比如说,windows 8应用程序将能够接受登录凭据并在服务器上的数据库中进行检查 --更新-- 我们检查了asp.net网站上的视频,但发现它仍然使用传统的控制器来执行身份验证/授权任务。视频仅显示我们可以使用[授权]属性。有没有一种方法可以使用ApicController,以便身份验证可以作为Web服务公开,供其他应用程序使用 --我的更新结束了-- 我一直在寻找一些示例代码/项目,但到目前为止没有找到。有人能提出解决办

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

--更新--

我们检查了asp.net网站上的视频,但发现它仍然使用传统的控制器来执行身份验证/授权任务。视频仅显示我们可以使用[授权]属性。有没有一种方法可以使用ApicController,以便身份验证可以作为Web服务公开,供其他应用程序使用

--我的更新结束了--

我一直在寻找一些示例代码/项目,但到目前为止没有找到。有人能提出解决办法吗


谢谢。

以下是我如何通过WebAPI进行身份验证的方法-它使用Forms Auth和SimpleMembershipProvider。我不是一个经验丰富的程序员,所以这可能是远离质量,但它应该让你开始。请注意,这只是对用户进行身份验证,而不是客户端api密钥实现。欢迎反馈

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

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);
        }

    }
}

你真的一直在喝微软的Kool-Aid,是吗;?是的,Windows8很酷。我自己也在玩。我绝对鼓励您使用它,并使用Metro UI。但就服务器端而言:K.I.S.S。!!!!!忘掉当前的框架,在你所知道的和你今天正在使用的基础上继续发展。甚至在客户端方面:请考虑替代框架,比如PoPiGAP。嗯,不一定是Windows8。这些天我一直在使用MVC4WebAPI。但是没有现有的示例向我展示如何使用ApicController进行身份验证。我会更新我的问题。你好,很公平。这些链接可能会有所帮助:另一个包含一些有趣内容的链接: