我被要求创建一个“身份验证/授权”中间人或代理作为http,MVC Web应用程序,以便这可以用于我们组织中的多个应用程序以进行身份验证/授权。意味着,用户将注册,登录此经纪人应用程序并且一旦确认经过身份验证的授权用户,他将相应地重定向到客户端应用程序。这是用例。
我选择OAuth和OWIN在MVC应用程序中开发此代理,这意味着一旦用户成功通过身份验证,OAuth(授权)将发出访问令牌+刷新令牌。我在Oauth Authorization Server的登录控制器中使用普通,简单,最小的身份验证逻辑,如下所示:
public class AccountController : Controller
{
public ActionResult Login()
{
var authentication = HttpContext.GetOwinContext().Authentication;
if (Request.HttpMethod == "POST")
{
var isPersistent = !string.IsNullOrEmpty(Request.Form.Get("isPersistent"));
if (!string.IsNullOrEmpty(Request.Form.Get("submit.Signin")))
{
var user = Constants.Users.UserCollection.Where(u => u.Email.ToLower() == Request.Form["username"].ToLower().Trim() && u.Password == Request.Form["password"].Trim());
if (user.Count() > 0)
{
authentication.SignIn(
new AuthenticationProperties { IsPersistent = isPersistent },
new ClaimsIdentity(new[]
{ new Claim(ClaimsIdentity.DefaultNameClaimType, Request.Form["username"]),
new Claim("DisplayName", user.FirstOrDefault().DisplayName) } , "Application"));
}
}
}
return View();
}
这是我正在开发这个概念性应用程序的MSFT示例应用程序。 https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server。
我的问题是:我在许多文章中都读到过,使用Oauth身份验证并不好,否则请使用OPENID Connect处理身份验证。坦率地说,我不习惯使用OPENID Connect,我不确定为我的组织创建OPENID提供程序的必要性,因为此服务仅供我们组织的客户使用 - 少于200,000个用户。我们几乎不需要用户注册和登录,此帐户需要在我们组织的不同Web应用程序中使用。请在这里帮助我提供您的意见。提前致谢。
我认为您的问题是关于OpenID Connect(OIDC)相对于OAuth 2.0的好处。
OIDC以OAuth 2.0为基础,因此您可以使用它的所有功能。在实际环境中,您应该问自己的问题是:使用您的“代理”(授权服务器/安全令牌服务/ OpenID提供商)的其他应用程序(客户端,API)是否需要了解有关用户的信息,在?他们需要ID,角色,用户名等吗?如果答案是否定的,并且您只需要一个签名令牌,则可能更适合使用OAuth。
如果您开始在访问令牌中包含用户声明(=属性),您至少应该看看OIDC。另请注意,即使您在访问令牌中包含声明,这些声明也适用于资源服务器(= API),并且对于客户端而言通常是不可访问的(除非您提取它们并在API端公开它们 - 这基本上就是OIDC userinfo
端点确实)。