背景
我们的 Web 应用程序使用外部身份验证,从某种意义上说,用户的用户名/密码并未在本地验证,而是在中央单点登录类型网站的 Web 应用程序“外部”进行验证。身份验证证明(和用户身份)通过本地服务器变量(HTTP_EMPLOYEEID
等)变得可用。但是,它不像针对 Google、Facebook 或其他基于 OAuth 的设置进行身份验证那样完全是外部的。所以我只是想做出这种区分,所以它不会与 ASP.NET Identity / Owin 中的术语“外部登录”冲突。
问题
我试图找出一种干净的方法来利用经过身份验证的用户数据(来自服务器变量)并将其传递给 ASP.NET 身份验证。但是,在用户可以登录到应用程序之前,必须根据 Web 服务查找用户配置文件和角色数据。
我想使用 Owin 和基于声明的身份,但我不确定是否也应该使用ASP.NET Identity,或者只是对声明进行更“纯”的实现。我喜欢不重新发明轮子的想法,但我也不想将方形钉子强行插入圆孔(俗话说),如果用户被识别和从 Web 服务查找的方式不适合一个典型的ASP.NET Identity用法。
例如,如果我采取更纯粹的方法,我可以这样做:
// Get the current user's id
var userId = HttpContext.Current.Request.ServerVariables["HTTP_EMPLOYEEID"];
// Get profile and role data from a web service
MyUser user = MyUserService.GetUserById(userId);
// Create claims
var claims = new Claim[]
{
new Claim(ClaimTypes.Name, user.Id),
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Role, user.Role), // there can be more roles, but you get the idea
// etc.
};
// Establish identity and login
var identity = new ClaimsIdentity(claims, "CookieAuthentication");
HttpContext.Current.GetOwinContext().Authentication.SignIn(identity);
但我也知道我可以使用 ASP.NET Identity(只是没有实体框架的东西),只需实现 IUser、IUserStore、IRoleStore(以及其他任何最低要求),并使用 Microsoft 现有的、已建立的框架来处理这个问题。争论是,这更符合当前标准,并且可能更容易扩展到其他类型的身份验证(例如,如果本地用户名/密码或 Google/Facebook 最终成为其他允许的身份验证选项,除了当前的、基于 ServerVariables 的设置)。
以前走这条路的人有什么建议吗?我是否应该将服务器变量注入的数据视为自定义中间件并通过 ASP.NET Identity 来利用它,或者只是不担心在那个世界中适合它的位置,并采用如上所述的更“纯粹”的方法?
ps 我使用的是 ASP.NET 4.6.1,而不是新的 ASP.NET Core。