Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 具有多个应用程序的ASP.NET标识_Asp.net Mvc_Asp.net Web Api_Single Sign On_Asp.net Identity - Fatal编程技术网

Asp.net mvc 具有多个应用程序的ASP.NET标识

Asp.net mvc 具有多个应用程序的ASP.NET标识,asp.net-mvc,asp.net-web-api,single-sign-on,asp.net-identity,Asp.net Mvc,Asp.net Web Api,Single Sign On,Asp.net Identity,因此,我们的组织正在使用asp.net mvc和web api开发一些新的web应用程序。我们决定不使用active directory进行身份验证/授权,因此看起来asp.net identity with entity framework可能会起作用 查看数据库模式,我没有看到应用程序表,因此我们可以有一个用于用户凭据和应用程序访问的中央存储库。这就是索赔的来源吗?那会是什么样子;用户->应用->角色->权限 此外,我们的目标之一是为用户提供单点登录。使用新的持票人代币可以吗 感谢您为单点登

因此,我们的组织正在使用asp.net mvc和web api开发一些新的web应用程序。我们决定不使用active directory进行身份验证/授权,因此看起来asp.net identity with entity framework可能会起作用

查看数据库模式,我没有看到应用程序表,因此我们可以有一个用于用户凭据和应用程序访问的中央存储库。这就是索赔的来源吗?那会是什么样子;用户->应用->角色->权限

此外,我们的目标之一是为用户提供单点登录。使用新的持票人代币可以吗


感谢您为单点登录提供的帮助,您可以共享cookie或使用不同的会话状态,如

您的用户及其凭据存储在
AspNetUser
表中,角色位于
ASPNetRole
中,而
AspNetUserRole
充当两者之间的连接表,以映射用户和角色。您可以通过在应用程序中共享这些表来实现SSO(单点登录)。每个应用程序都需要阅读这些表、角色和登录用户。但更好的方法是创建一个中央WebApi来处理用户身份验证和授权


另外,如果您可以在运行时更改角色,那么您就知道权限,您可以创建一个用于存储权限的自定义表,然后将角色映射到权限。当用户登录时,只需加载其所有权限并存储为声明。您可以序列化整个角色(及其权限列表)并将其存储为一个声明。或者将每个权限存储为单独的声明,以最适合您的为准。

查看本教程。它显示了如何使用Web API实现ASP.NET标识:

至于处理多个应用程序。我想到的两种方法是:

  • 向所有用户名追加一个
    AppId
  • AppId
    列添加到
    AspNetUsers
    表中,从
    UserStore
    派生并重新实现基于
    Find
    的方法,以便查询考虑
    AppId
  • 对于#1,当应用程序想要创建新用户时,它会向WebApi发送一个包含新用户信息和
    AppId
    的请求。然后WebApi将连接
    用户名
    AppId
    ,以创建将写入数据库的完整用户名。因此,如果应用程序
    1234
    希望使用用户名
    myuser
    创建一个用户,那么WebApi将使用用户名
    myuser\u 1234
    创建一个新用户。从那时起,在查询数据库时,首先从请求中获取
    用户名
    AppId
    ,将它们连接起来,然后查询数据库

    如果另一个应用程序
    9900
    想要创建
    myuser
    ,那么写入数据库的最终用户名将是
    myuser\u 9900

    您可能希望将应用程序详细信息存储在数据库中,并对每个请求验证
    AppId
    ,以确保在处理其请求之前识别应用程序

    我对第二步考虑得不多,所以这只是一个建议

    如果您希望在多个应用程序之间共享用户凭据,那么您可能可以忽略上述内容,使用标准功能,让所有应用程序指向同一个数据库,从而允许所有应用程序访问所有用户,而不管哪个应用程序创建了哪个用户


    更新#1:在这种情况下,可以使用承载令牌,我认为(从内存中)上面提到的教程系列涉及到这一点,以及单个WebApi如何为多个应用程序提供令牌。

    会话状态与身份验证无关。您的角色是固定的还是动态的。例如,最终用户可以在运行时更改角色,或者每个角色在开发阶段都有固定的权限。我正在尝试在两个不同子域上的两个不同应用程序之间共享凭据,因此它们在两个不同的应用程序池上运行,并且无法使用在另一个web应用程序上创建的凭据登录。似乎密码在两个应用程序上的散列方式不同,因此验证失败。