繁体   English   中英

使用外部PHP API的ASP.net MVC身份验证

[英]ASP.net MVC Authentication using external PHP API

我正在开发具有以下要求的asp.net MVC网站:

  1. 为“管理员”和“用户”开发页面,必须根据登录的用户角色访问这些页面:“管理员”或“用户”
  2. 该网站仅支持登录,您将调用一个驻留在外部网站上的PHP API,其返回的JSON结果包括ID,用户名和角色(管理员,用户)
  3. 您可以将返回的json的结果保存在要在您的页面中使用的会话中,但是此数据必须在注销或会话到期后消失。

我知道如何开发调用HTTP的内容和处理json,但是我不熟悉授权和身份验证的内容,也不熟悉使用成员资格提供程序,因此进行了很多搜索,起初我想使用SimpleMembership,但是我发现不会因为它取决于SQL查询,所以可以工作,在我的情况下,我将不使用任何类型的数据库。

我听说过asp.net身份信息,但是我不确定如何使用它,或者是否适合我的情况,我再次搜索,找不到任何资源来帮助我实现我的情况的身份验证和授权

我正在寻求您的帮助,以帮助我并指出正确的方向

谢谢您的帮助

有一个使用OAuth分隔的HTTP身份验证API的示例: http : //www.asp.net/web-api/overview/security/external-authentication-services

是的,此示例取决于某些指定的http API。但是,如果您有其他JSON / XML RPC API,则可以尝试创建自己的功能,例如:

public class ExternalAuthAPIClient {
    public User Auth(string username, string password) { .... }
}

而在方法登录使用它在你的AuthController

但! 这种方法需要进行很多改动。.在哪里存储用户..然后创建自定义的AuthenticateAttribure ...等。

更好的解决方案是在PHP端创建支持oAuth的API,并将其与ASP.NET Identity结合使用。

我终于找到了一个解决方案,因为我的网站仅支持登录并通过API支持,所以不需要使用任何成员资格提供程序,我编写了以下代码,该代码位于AccountController

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel login, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            ViewBag.Error = "Form is not valid; please review and try again.";
            return View(login);
        }

        //Call external API,check if credentials are valid,set user role into userData
        string userData="Admin";

        var ticket = new FormsAuthenticationTicket(
        version: 1,
        name: login.Username,
        issueDate: DateTime.Now,
        expiration: DateTime.Now.AddSeconds(HttpContext.Session.Timeout),
        isPersistent: false,
        userData: userData);

        var encryptedTicket = FormsAuthentication.Encrypt(ticket);
        var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

        HttpContext.Response.Cookies.Add(cookie);

        if (Url.IsLocalUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }
        return RedirectToAction("Index", userData);

    }

然后使用Authorize属性装饰管理员/用户控制器,如下所示:

[Authorize(Roles = "admin")]
public class AdminController : Controller

然后在Global.asax添加以下代码:

        public override void Init()
        {
            base.PostAuthenticateRequest += Application_PostAuthenticateRequest;
        }
        protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
                var decodedTicket = FormsAuthentication.Decrypt(cookie.Value);
                var roles = decodedTicket.UserData;

                var principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);
                HttpContext.Current.User = principal;
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM