IdentityServer4 + ASP.NET核心API + Angular:登录/身份验证

jac*_*pop 6 api asp.net-core identityserver4 angular

我正在使用IdentityServer4来处理我的ASP.NET核心API中的身份验证和授权.我在客户端使用angular4.我知道我可以使用grantype = 来使用令牌端点(http:// myapidomain/connect/token)来获取.这意味着我提供并在登录UI中进行身份验证.access_tokenResourceOwnerPasswordusernamepassword

我的问题是:我们是否需要再实施API Account/Login?我认为IdentityServer4已经通过cookie身份验证中间件自动处理登录.如果我们需要实现API Account/Login.实现这一目标的最佳做法是什么.我在某处读到的是使用它进行登录

await  HttpContext.Authentication.SignInAsync(identityUser.Id,                                                                             identityUser.UserName);
Run Code Online (Sandbox Code Playgroud)

这用于注销

await HttpContext.Authentication.SignOutAsync
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是:当我离开access_token时connect/token.我尝试通过访问http:// myapidomain/connect/userinfo来获取userinfo.但我总是得到405错误代码.我失踪了什么

在角客户端

authFormHeaders() {
    const header = new Headers();
    header.append('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
    header.append('Accept', 'application/json');
    header.append('Authorization', 'Bearer ' + this.oidcSecurityCommon.getAccessToken());
    return header;
  }

getUserInfo() {
        let self = this;
        let options = new RequestOptions({
            method: RequestMethod.Get,
            headers: this.authService.authFormHeaders()
        });
        return self.http.get(this.authWellKnownEndpoints.userinfoEndpoint, options)
            .map((res: Response) => {
                return res.json();
            })
            .catch(self.appService.handleError);
    }
Run Code Online (Sandbox Code Playgroud)

在我的API服务器端:

CorsPolicyBuilder corsBuilder = new CorsPolicyBuilder()
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowAnyOrigin()
                .AllowCredentials();
            services.AddCors(opts =>
            {
                opts.AddPolicy("AllowAllOrigins", corsBuilder.Build());
            });

var url = optionsAccessor.Value.SystemConfig.Authority;
            app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
            {
                Authority = url,
                RequireHttpsMetadata = false,
                ApiName = "netpower.qms.saas.api"/*,
                AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId }*/
            });
app.UseCors("AllowAllOrigins");
Run Code Online (Sandbox Code Playgroud)

Roh*_*ith 3

对于 Angular 客户端,您应该使用 granttype Implicit而不是ResourceOwnerPassword。资源所有者密码凭据授予类型适用于资源所有者与客户端具有信任关系的情况,例如设备操作系统或高特权应用程序。\ n授权服务器在启用此授权类型时应特别小心,并且仅在其他流程不可行时才允许它(来自 OAuth规范)

\n
\n

资源所有者密码授予类型允许通过将用户\xe2\x80\x99 的名称和密码发送到令牌端点来代表用户请求令牌。这就是所谓的 \xe2\x80\x9c 非交互式\xe2\x80\x9d 身份验证,\n通常不建议这样做。某些旧版\n或第一方集成方案可能因某些原因而需要此授权类型,\n但一般建议\n使用交互流程(如隐式或混合)进行用户身份验证。

\n
\n

对于使用 Implicit 的实现,可以参考这个,对于使用 ResourceOwnerpassword 的实现,可以参考这个。

\n

资源类型的流程如下

\n
+----------+\n | Resource |\n |  Owner   |\n |          |\n +----------+\n      v\n      |    Resource Owner\n     (A) Password Credentials\n      |\n      v\n +---------+                                  +---------------+\n |         |>--(B)---- Resource Owner ------->|               |\n |         |         Password Credentials     | Authorization |\n | Client  |                                  |     Server    |\n |         |<--(C)---- Access Token ---------<|               |\n |         |    (w/ Optional Refresh Token)   |               |\n +---------+                                  +---------------+\n
Run Code Online (Sandbox Code Playgroud)\n

对于 Angular 和 Identity Server 4 的 ResourceOwnerPassword 类型,您可以参考此GitHub 存储库,其中还包含一些客户端和服务器端的示例代码

\n

步骤如下

\n
    \n
  1. 资源所有者向客户端提供其用户名和\n密码。

    \n
  2. \n
  3. 客户端通过包含从资源所有者接收到的凭据,从授权服务器的令牌端点请求访问令牌。发出请求时,客户端向授权服务器进行身份验证。

    \n
  4. \n
  5. 授权服务器对客户端进行身份验证并验证资源所有者凭据,如果有效,则颁发访问令牌。

    \n
  6. \n
\n

我们还需要实现 API 帐户/登录吗?

\n

不,你不必实现。正如你所怀疑的,这是在授权服务器中完成的。你将把用户名和密码发送到 Identity Server 4 身份验证服务器,这将为你提供不记名令牌。并且你的中间件 ( app.UseIdentityServerAuthentication) 将验证您的应用程序的请求。

\n

我尝试通过访问 http://myapidomain/connect/userinfo 来获取用户信息。但我总是收到 405 错误代码。我的缺失是什么

\n

您可以查看身份服务器日志以找出丢失的内容。我捕获了一个示例请求,它看起来像这样

\n
POST http://myapidomain/connect/token HTTP/1.1\nHost: myapidomain\nProxy-Connection: keep-alive\nContent-Length: 142\nPragma: no-cache\nCache-Control: no-cache\nAccept: application/json, text/plain, */*\nOrigin: http://angularspawebapi.azurewebsites.net\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36\nContent-Type: application/x-www-form-urlencoded\n\n\nclient_id=AngularSPA&grant_type=password&username=admin%40gmail.com&password=Admin01*&scope=WebAPI%20offline_access%20openid%20profile%20roles\n\n\nGET http://myapidomain/connect/userinfo HTTP/1.1\nHost: myapidomain\nProxy-Connection: keep-alive\nPragma: no-cache\nCache-Control: no-cache\nAccept: application/json, text/plain, */*\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36\nAuthorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjhDRTQ1ODAwQTAwNkExNkZGMzEwOTExMDVCRjNDNTY2MzgzNEUxQkEiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJqT1JZQUtBR29XX3pFSkVRV19QRlpqZzA0Ym8ifQ.eyJuYmYiOjE1MDAwOTk4NjIsImV4cCI6MTUwMDEwMDc2MiwiaXNzIjoiaHR0cDovL2FuZ3VsYXJzcGF3ZWJhcGkuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOlsiaHR0cDovL2FuZ3VsYXJzcGF3ZWJhcGkuYXp1cmV3ZWJzaXRlcy5uZXQvcmVzb3VyY2VzIiwiV2ViQVBJIl0sImNsaWVudF9pZCI6IkFuZ3VsYXJTUEEiLCJzdWIiOiI5Y2I1ZGViNS1iZWRmLTRkMWItOThkNS05ZTFjYTgwNzVhYjAiLCJhdXRoX3RpbWUiOjE1MDAwOTk4NjEsImlkcCI6ImxvY2FsIiwicm9sZSI6ImFkbWluaXN0cmF0b3IiLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIiwicm9sZXMiLCJXZWJBUEkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsicHdkIl19.CZAGtK5hvwgkMvX9NQ-8zTFr8Cv3SRVhM-u1WdqdLwI-qbdknfhhVFFHFpPzEWEJnKhsi3aE_BOb_UtRiDBWNHzlXAGmKSjtd70HOlT3dR9Sj_v09Ld15On3HihgfeDwOzIt10ZYwwjRr1tRCf6Ro41FQ2UrzBYcSFe47md7DSlxPXbjnQAHdu8gHMITFF8Nqx0V9OEw21fofRdBalOpvxf1IBhsJwWLyL4bLFYya8jNispK4MnN_tdaS8kxIMZ8iC_IUlhY4XEj5pkDBA9r8ad_Vn5WavO3Lmr4Tew4uBhlFhbE-Qr6EpErAEBVHVtJYs70XXGJJ7QQLoFNmO5M9w\ncontent-type: text/plain\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我认为您过度使用“不要使用 ResourceOwnerPassword 流”卡。正如您引用的文字所述,它是第一方集成的合适流程,特别是当您拥有客户端、API、身份服务器并且它们是您的用户时,它可以提供更清晰的用户体验。当然,您不希望第三方客户端为“您的”用户使用该流程,但我不同意与客户端的信任关系需要“高度特权”或操作系统级别。 (2认同)