【发布时间】:2017-06-26 14:04:23
【问题描述】:
我试图了解在 ASP.NET Core 中进行身份验证的正确方法。我查看了几个资源(其中大部分已过时)。
有些人提供替代解决方案,说明使用基于云的解决方案,例如 Azure AD,或使用 IdentityServer4 并托管我自己的令牌服务器。
在旧版本的 .Net 中,一种更简单的身份验证形式是创建自定义原则并在其中存储额外的身份验证用户数据。
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
- 这些技术有哪些简单的实现方式?
【问题讨论】:
-
这个问题太宽泛,而且还高度基于意见。可能的答案太多,或者对于这种格式来说,好的答案太长了。请添加详细信息以缩小答案集或隔离可以在几段中回答的问题。许多好的问题会根据专家的经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。
-
@Nkosi 抱歉这句话是这样的。我澄清了这一点更具体
标签: c# asp.net authentication asp.net-core openid-connect