首页 文章

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

提问于
浏览
6

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

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

await  HttpContext.Authentication.SignInAsync(identityUser.Id,                                                                             identityUser.UserName);

这用于注销

await HttpContext.Authentication.SignOutAsync

我的第二个问题是:当我从 connect/token 获得 access_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);
    }

在我的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");

1 回答

  • 2

    对于角客户端,则应该使用grantype Implicit和不ResourceOwnerPassword .The资源所有者密码凭证授予类型适合在资源所有者具有与客户的信任关系,诸如设备操作系统或高度特权应用程序的情况 . 启用此授权类型时,授权服务器应特别小心,并且只有在其他流不可行时才允许它(来自OAuth Spec

    资源所有者密码授予类型允许通过将用户的名称和密码发送到令牌 endpoints 来代表用户请求令牌 . 这就是所谓的“非交互式”身份验证,通常不推荐使用 . 某些遗留或第一方集成方案可能有原因,其中此授权类型很有用,但一般建议是使用隐式或混合的交互式流来代替用户身份验证 .

    对于使用Implicit的实现,您可以参考this并使用ResourceOwnerpassword,请参阅this .

    资源类型的流程如下

    +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          v
          |    Resource Owner
         (A) Password Credentials
          |
          v
     +---------+                                  +---------------+
     |         |>--(B)---- Resource Owner ------->|               |
     |         |         Password Credentials     | Authorization |
     | Client  |                                  |     Server    |
     |         |<--(C)---- Access Token ---------<|               |
     |         |    (w/ Optional Refresh Token)   |               |
     +---------+                                  +---------------+
    

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

    步骤如下

    • 资源所有者为客户端提供其用户名和密码 .

    • 客户端通过包含从资源所有者收到的凭据,从授权服务器的令牌 endpoints 请求访问令牌 . 发出请求时,客户端使用授权服务器进行身份验证 .

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

    do we need to implement API Account/Login anymore?

    不,你不必implement.As你怀疑,这是在授权Server.You做会发送到Identity Server的4验证服务器的用户名和密码,将会给您的承载token.And中间件( app.UseIdentityServerAuthentication )将验证您的申请的请求 .

    I try to get userinfo by access http://myapidomain/connect/userinfo. But I always get 405 error code. What are my missing

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

    POST http://myapidomain/connect/token HTTP/1.1
    Host: myapidomain
    Proxy-Connection: keep-alive
    Content-Length: 142
    Pragma: no-cache
    Cache-Control: no-cache
    Accept: application/json, text/plain, */*
    Origin: http://angularspawebapi.azurewebsites.net
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
    Content-Type: application/x-www-form-urlencoded
    
    
    client_id=AngularSPA&grant_type=password&username=admin%40gmail.com&password=Admin01*&scope=WebAPI%20offline_access%20openid%20profile%20roles
    
    
    GET http://myapidomain/connect/userinfo HTTP/1.1
    Host: myapidomain
    Proxy-Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache
    Accept: application/json, text/plain, */*
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjhDRTQ1ODAwQTAwNkExNkZGMzEwOTExMDVCRjNDNTY2MzgzNEUxQkEiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJqT1JZQUtBR29XX3pFSkVRV19QRlpqZzA0Ym8ifQ.eyJuYmYiOjE1MDAwOTk4NjIsImV4cCI6MTUwMDEwMDc2MiwiaXNzIjoiaHR0cDovL2FuZ3VsYXJzcGF3ZWJhcGkuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOlsiaHR0cDovL2FuZ3VsYXJzcGF3ZWJhcGkuYXp1cmV3ZWJzaXRlcy5uZXQvcmVzb3VyY2VzIiwiV2ViQVBJIl0sImNsaWVudF9pZCI6IkFuZ3VsYXJTUEEiLCJzdWIiOiI5Y2I1ZGViNS1iZWRmLTRkMWItOThkNS05ZTFjYTgwNzVhYjAiLCJhdXRoX3RpbWUiOjE1MDAwOTk4NjEsImlkcCI6ImxvY2FsIiwicm9sZSI6ImFkbWluaXN0cmF0b3IiLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIiwicm9sZXMiLCJXZWJBUEkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsicHdkIl19.CZAGtK5hvwgkMvX9NQ-8zTFr8Cv3SRVhM-u1WdqdLwI-qbdknfhhVFFHFpPzEWEJnKhsi3aE_BOb_UtRiDBWNHzlXAGmKSjtd70HOlT3dR9Sj_v09Ld15On3HihgfeDwOzIt10ZYwwjRr1tRCf6Ro41FQ2UrzBYcSFe47md7DSlxPXbjnQAHdu8gHMITFF8Nqx0V9OEw21fofRdBalOpvxf1IBhsJwWLyL4bLFYya8jNispK4MnN_tdaS8kxIMZ8iC_IUlhY4XEj5pkDBA9r8ad_Vn5WavO3Lmr4Tew4uBhlFhbE-Qr6EpErAEBVHVtJYs70XXGJJ7QQLoFNmO5M9w
    content-type: text/plain
    

相关问题