我正在尝试理解在ASP.NET Core中进行身份验证的正确方法。我查看了几个资源(大多已过时)。
有些人提供替代方案,建议使用基于云的解决方案,如Azure AD,或使用IdentityServer4并自己托管令牌服务器。
在旧版本的.Net中,其中一种更简单的身份验证形式是创建一个自定义Iprinciple,并在其中存储附加的身份验证用户数据。
public interface ICustomPrincipal : System.Security.Principal.IPrincipal
{
string FirstName { get; set; }
string LastName { get; set; }
}
public class CustomPrincipal : ICustomPrincipal
{
public IIdentity Identity { get; private set; }
public CustomPrincipal(string username)
{
this.Identity = new GenericIdentity(username);
}
public bool IsInRole(string role)
{
return Identity != null && Identity.IsAuthenticated &&
!string.IsNullOrWhiteSpace(role) && Roles.IsUserInRole(Identity.Name, role);
}
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get { return FirstName + " " + LastName; } }
}
public class CustomPrincipalSerializedModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后您将数据序列化为一个 cookie,并将其返回给客户端。
public void CreateAuthenticationTicket(string username) {
var authUser = Repository.Find(u => u.Username == username);
CustomPrincipalSerializedModel serializeModel = new CustomPrincipalSerializedModel();
serializeModel.FirstName = authUser.FirstName;
serializeModel.LastName = authUser.LastName;
JavaScriptSerializer serializer = new JavaScriptSerializer();
string userData = serializer.Serialize(serializeModel);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,username,DateTime.Now,DateTime.Now.AddHours(8),false,userData);
string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(faCookie);
}
我的问题是:
如何进行类似于之前版本的 .Net 那样的身份验证,旧方式仍然有效还是有更新版本。
使用自己的令牌服务器与创建自定义原则有什么利弊?
在使用基于云的解决方案或单独的令牌服务器时,如何将其与当前应用程序集成,在我的应用程序中是否仍需要一个用户表以及如何关联这两个表?
由于有许多不同的解决方案,我如何创建企业应用程序,允许通过 Gmail/Facebook 进行登录,同时仍能扩展到其他 SSO。
- 这些技术的一些简单实现是什么?