【问题标题】:ASPNet Identity Authentication MVC5 Client web site->Auth Server-> Web API serverASPNet Identity Authentication MVC5 Client web site->Auth Server-> Web API server
【发布时间】:2014-07-19 01:01:49
【问题描述】:

我是 ASPnet 身份服务的新手,我们需要以下要求。

以下是架构设置

1。应用服务器

Appsever 拥有
一种。实体框架
湾。 ASP.Net Web API2 Odata 服务
C。授权服务器

2。网络服务器

ASP.Net MVC 5 应用程序(访问应用服务器的客户端)

流程需要

  1. 具有登录/注册表单的 MVC5 客户端应用程序

  2. 注册/登录时,需要将信息发送到应用服务器中的授权服务器,使用身份服务授权并创建声明。

  3. 在授权服务器中创建身份后,客户端应用程序应登录

  4. 我知道从身份验证服务器获取不记名令牌,并将用作访问 API 服务的标头信息

我们所缺少的只是 MVC 客户端应用程序应该使用在授权服务器中创建的相同身份声明。

有什么方法可以访问在身份验证服务器中创建的声明。

我有一些关于如何在身份验证服务器中进行身份验证并通过 OWIN 接收令牌的示例,我们可以从这个令牌安全地访问 API,但我需要客户端 Web 应用程序需要基于令牌登录

我浏览了以下链接

http://blogs.msdn.com/b/webdev/archive/2013/09/20/understanding-security-features-in-spa-template.aspx

此外,我还需要在登录后需要时添加声明

【问题讨论】:

  • 您在使用安全令牌服务吗?
  • 是的,从身份验证服务器创建了一个承载令牌。另外,如果我知道如何通过此令牌访问声明身份也会更有帮助
  • @ansari 关于该主题的任何更新?我也有同样的情况。我可以使用令牌,但无法在客户端应用程序中提取数据
  • @LóriNóda 请检查答案作为我的方法。如果您需要更多说明,请告诉我

标签: asp.net-mvc asp.net-identity owin asp.net-web-api2


【解决方案1】:

我已经解决了这个问题,但我不确定这是不是有效的方法

  1. 一旦登录并检索不记名令牌(此令牌应已分配声明身份,例如用户名、角色..等)

  2. 在 web api AccountController 中,需要创建一个方法来检索客户端 web 应用程序所需的默认声明。请检查以下内容

    [Authorize]
    [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
    [Route("UserInfo")]
    public UserInfoViewModel GetUserInfo()
    {
        var firstname = ((ClaimsIdentity)User.Identity).Claims.Where(c => c.Type.Equals("FirstName")).SingleOrDefault();
        var lastname = ((ClaimsIdentity)User.Identity).Claims.Where(c => c.Type.Equals("LastName")).SingleOrDefault(); 
    
        var IsApproved = ((ClaimsIdentity)User.Identity).Claims.Where(c => c.Type.Equals("IsApproved")).SingleOrDefault();
    
        var userinfo = new UserInfoViewModel
        {
            UserName = User.Identity.GetUserName(),
            FirstName = firstname.Value.ToString(),
            LastName = lastname.Value.ToString(),
            UserApproved = Convert.ToBoolean(IsApproved.Value.ToString()),
            HasRegistered = externalLogin == null,
            LoginProvider = externalLogin != null ? externalLogin.LoginProvider : null
        };
    
        return userinfo;
    }
    
  3. 从客户端,这个actin将通过token作为header调用。

  4. 一旦我们获得了信息(Json 字符串格式),需要使用 javascript 序列化程序使用 UserInfoViewModel 类进行序列化(用户定义的视图模型基于我们需要的信息并从 webapi 帐户发送)

  5. 使用这些视图模型信息,将它们分配到本地存储并使用(我的情况是 cookie)作为本地身份

  6. 当您从 Web 应用程序中注销时,也要保持注销 webapi。

如果您需要更多信息或代码,请告诉我

【讨论】:

  • 似乎这是一种可行的方法,但我认为我们可以在框架(WIF)的帮助下做到这一点,直到我们没有更好的解决方案,我认为我应该使用它。无论如何,谢谢你的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 2018-07-18
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多