在ASP.NET MVC和Angular 6之间进行单点登录

时间:2018-09-20 16:13:57

标签: asp.net-mvc angular

我目前正在使用ASP.NET MVC和Web Api对用户进行身份验证。我希望我的用户通过ASP.NET MVC登录页面登录,但需要通过身份验证才能访问Angular 6应用程序。

我想采用这种方法,因为我希望将来链接到其他需要身份验证的应用程序,但允许用户在登录页面登录后访问这些应用程序。

我可以使用哪种单一登录方法来验证用户身份?

2 个答案:

答案 0 :(得分:1)

  

我能够在我的mvc应用程序上生成访问令牌,并且   进行身份验证,但如何在角度验证用户   使用相同访问令牌的应用程序?

最好的方法是不创建自定义令牌。相反,您想使用行业标准-OAuth 2.0和OpenID Connect。

您可以自己设置IdentityServer或使用身份提供程序,例如Azure Active Directory Auth0。

答案 1 :(得分:0)

您可以尝试在使用ASP.NET MVC登录名进行身份验证后生成令牌(JWT)。

public ActionResult Test()
{
    string currentUser = User.Identity.GetUserName();
    if (currentUser.Length != 0)
    {
        // build JWT Token
        DataAccess dataAccess = new DataAccess();
        ViewBag.Token = dataAccess.BuildTokenObject(currentUser).BearerToken;
    }
    return View();
}

构建令牌功能。您可以为令牌设置到期时间,也可以在JWT上搜索有关在令牌中设置时间到期的详细代码。

public TokenInfo BuildTokenObject(string user)
{
   TokenInfo token = new TokenInfo();
   UserRole roleInfo = new UserRole();
   List<ClaimInfo> claims = new List<ClaimInfo>();

   roleInfo = GetRole(user);
   token.UserName = user;
   token.BearerToken = new Guid().ToString();
   token.RoleName = roleInfo.Role_Name;
   token.IsSysAdmin = roleInfo.isSysAdmin;
   token.Claims = GetClaims(roleInfo.Role_Name);

   // Set JWT bearer token
   token.IsAuthenticated = token.RoleName == "" ? false : true;
   token.BearerToken = BuildJwtToken(token);
   return token;
}

Angular应用程序使用Route Guard读取令牌。 如果验证有问题,请重定向到错误页面。

export class AuthGuardService implements CanActivate {

    constructor(private _authService: AuthService, 
            private _router: Router) {}

    canActivate(): Observable<boolean> | Promise<boolean> | boolean {
        // check if token has expired
        if (this._authService.isAuthenticated()) {
            return true;
        } else {
           this._router.navigate(['/error']);
            return false;
        }
   }    
}

读取令牌到期的功能。

isAuthenticated(): boolean {        
    let jwt = localStorage.getItem('cs-token');
    if (HELPER.isTokenExpired(jwt)) {
        return false;
    } else {
        return true;
    }
}

其他参考: https://jwt.io/