2017-02-22 63 views
2

我正在構建一個新的Angular2應用程序,它將駐留在.NET應用程序平臺內。我的Angular2應用程序應該獲取當前登錄用戶的API調用來獲取數據。我如何獲得userId到我的應用程序。從.NET平臺獲取已登錄的用戶到Angular 2應用程序

+0

在localstorage內成功登錄後保存您的用戶。 – JoeriShoeby

+0

是的,但登錄發生在平臺級別。 – indra257

+0

那麼你在成功登錄後將它保存在哪裏? – JoeriShoeby

回答

4

由於您沒有明確指定您正在使用的.Net平臺,因此我將假定它是最近的一個 - Asp.Net Core,其身份驗證提供程序爲Asp.Net Identity。

如果您使用默認的Asp.Net Identity模板,您可以簡單地使用基於Cookie的身份驗證來處理您的Web API請求。當您通過Angular 2s http服務撥打電話時,cookie會自動通過瀏覽器傳送到服務器,因此您無需在此指定任何內容。

下面是一些最起碼的代碼,可以做你想做的:

登錄方法,在您的服務器端控制器

[HttpPost("Login")] 
public async Task<IActionResult> Login([FromBody] LoginPost model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Require the user to have a confirmed email before they can log on. 
     var user = await _userManager.FindByEmailAsync(model.Email); 
     if (user != null) 
     { 
      var result = await _signInManager.PasswordSignInAsync(user, model.Password, model.StayLoggedIn, lockoutOnFailure: false); 
      if (result.Succeeded) 
      { 
       return Ok(); 
      } 
     } 
    } 
    return BadRequest(); 
} 

角2服務的方法來執行登錄

這是從所謂的登錄組件,例如承載登錄表單的組件。

public login(email: string, password: string, stayLoggedIn: boolean): Promise<boolean> { 
    var url = '/Api/Account/Login'; 
    var loginCredentials = { 
     email: email, 
     password: password, 
     stayLoggedIn: stayLoggedIn 
    }; 
    return this.http 
     .post(url, loginCredentials) 
     .toPromise() 
     .then(response => { 
      return response.ok; 
     }) 
     .catch(() => { 
      return false; 
     }); 
} 

成功登錄後,_signInManager.PasswordSignInAsync()將設置會自動通過進一步的請求框架驗證客戶端上的cookie。

用戶信息的方法服務器端

[HttpGet("Auth")] 
public async Task<IActionResult> Auth() 
{ 
    var model = new AuthGet(); 
    if (!User.Identity.IsAuthenticated) 
    { 
     model.IsAuthenticated = false; 
     return Ok(model); 
    } 
    var user = await _userManager.GetUserAsync(User); 
    var roles = await _userManager.GetRolesAsync(user); 
    model.Username = user.UserName; 
    model.IsAuthenticated = true; 
    model.Id = user.Id; 
    model.Email = user.Email; 
    model.Roles = roles; 
    return Ok(model); 
} 

這僅僅是一些服務器端的代碼,返回有關用戶

當前登錄的基本信息,使該信息可在您的客戶端代碼

import { Injectable } from '@angular/core'; 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 
import { Http } from '@angular/http'; 
import { Auth } from '../Models/Account/auth'; 

@Injectable() 
export class AuthService { 

    private authSource = new BehaviorSubject<Auth>(new Auth); 
    public auth = this.authSource.asObservable(); 

    constructor(private http: Http) { 
     this.updateAuth(); 
    } 

    public updateAuth() { 
      var url = '/Api/Account/Auth'; 
      this.http 
       .get(url) 
       .toPromise() 
       .then(response => { 
        var auth = response.json() as Auth; 
        this.authSource.next(auth); 
       }); 
    } 
} 

AuthService現在提供Observable,您可以在您的組件中訂閱,例如例如這樣的:

private auth: Auth; 
private authSubscription: Subscription; 

ngOnInit() { 
    this.updateProfileOverview(); 
    this.authSubscription = this.authService.auth.subscribe(newAuth => { 
     this.auth = newAuth; 
     // React to the new auth value 
    }); 
} 

獲取在您的服務器端控制器

現在,請求由框架內自動驗證的用戶ID,您可以通過注射它利用Asp.Net身份的UserManager您控制器以及使用它得到的用戶ID是這樣的:

namespace App.Controllers 
{ 
    public class DataController : Controller 
    { 
     public NotesController(UserManager<ApplicationUser> userManager) 
     { 
      _userManager = userManager; 
     } 

     private readonly UserManager<ApplicationUser> _userManager; 

     public async Task<IActionResult> CreateNote() 
     { 
      var userId = _userManager.GetUserId(User); 
      // Use it... 
     } 
    } 
} 

User屬性是存在於從基Controller類派生的所有類。

+0

非常感謝您提供的所有信息。但是在這裏,您假設了Angular 2應用程序的登錄組件。在我的情況下,Angular2應用程序不會有任何登錄組件。它將作爲一個兒童應用程序託管在平臺內。當用戶登錄到平臺時,他應該能夠看到Angular2應用程序的菜單項。一旦我點擊,我的實際Angular2應用程序加載。所以在這裏,爲了加載我的Angular2應用程序,我需要訪問具有認證的REST API。所以我應該能夠獲得在平臺級別使用的用戶標識。 – indra257

+0

Angular 2應用程序是否將api請求發送給同樣服務於主/父級的後端?如果是的話,並且如果您使用的是基於Asp.Net身份Cookie的身份驗證,則您不必在Angular 2應用程序中進行任何身份驗證。如果您可以在原始問題中添加一些關於您的設置的更多細節,那將是非常好的。 – GeorgDangl

+0

是的,它使用相同的api請求。來到最初的問題,在我的angular2應用程序中,我需要傳遞Auth-id(用戶標識)來獲取數據。那麼如何獲得已用於在平臺級別登錄的用戶ID。 – indra257

相關問題