我对ASP.NET标识的体系结构有疑问 .
这是我的设置 .
-
主要解决方案 - 业务,数据和Web API项目
-
UI解决方案 - 使用web api的MVC项目
我已经在web api上使用身份验证和授权实现了身份 .
我不明白的是如何从web api服务中的UI访问所有user.identity内容?登录后,我是否创建了一个用于建模ApplicationUser / IdentityUser的类?似乎User类中存在重复 . 对我来说,我知道授权是在web api中完成的,所以不需要所有的属性 . 但是,如果没有授权操作列表,UI如何显示授权模块?
UI是否仅检查用户是否已通过UI身份验证并依赖Web服务来授权操作?我认为这是分离Mvc和Web API的挑战 .
2 回答
如果您的应用程序在很大程度上依赖于授权,那么在您采取操作之前,您的UI可能会反映用户的授权 . 例如,如果用户未被授权编辑对象,那么用“编辑”按钮呈现它们是没有意义的 .
如果您感兴趣的唯一信息是他们有权执行的操作,那么最佳解决方案可能会扩展
UserInfoViewModel
类,该类由默认AccountController.cs
文件中的GetUserInfo()
操作返回 . 例如,您可以将其扩展为包含IsAdmin
属性,甚至可以包含Roles
或Claims
的集合 .为什么要分离Web API和MVC项目?你有没有特别的理由呢?
如果您有两个项目,一个公开Web API,一个公开使用MVC的UI,您将在Web服务器上运行两个独立的应用程序,具有单独的上下文 . 将其视为为第三方网站构建MVC UI应用程序,以暴露基于Web的API服务 .
这意味着外部应用程序(MVC)需要代表用户对内部应用程序(Web API)进行身份验证,并以某种方式存储授权令牌,以便后续调用API . 不确定你是如何实现这一点的,但可以使用会话变量(不是一个好主意)或加密的授权cookie来完成 .
外部应用程序了解登录用户的内容仅是用户发送的用于身份验证的内容(如用户名或电子邮件)以及从Web API身份验证返回的响应(包含令牌和到期日期) . 如果您需要在外部(MVC)应用程序中获得更多信息,则必须:
自定义Web API身份验证以包含其他信息 - 请参阅AspNet Identity 2: Customize OAuth endpoint response
在内部(Web API)应用程序中添加另一个服务,该服务返回您可能需要的有关登录用户的任何信息,并在MVC应用程序中进行身份验证后立即调用它 .
并且您必须自己管理/保留外部应用程序(MVC)中返回的信息 .
您可能还希望在外部应用程序(MVC)上单独使用ASP.NET标识,并将内部应用程序用作OAuth提供程序;但我不认为这就是你所追求的 .
无论如何,我认为你需要重新评估你的架构,并考虑分离Web API和MVC项目 . 如果您在同一个地方部署这两个应用程序,这种方法不仅会增加大量的麻烦(比如管理您要求的授权),而且还意味着更多(不必要的)工作服务器,性能较低 . 而且我认为你可能从这种分离中获得任何好处 .