2017-08-02 73 views
1

我开发了一个项目ASP.NET MVC。在我的项目中,我有两种用户:1-User2-Customer如何在asp.net中使用ASP.NET身份的Web服务mvc

我使用ASP.NET身份对用户进行授权和我有这样的方法登录:

public virtual async Task<ActionResult> Login(LoginViewModel loginViewModel, string returnUrl) 
{ 
    var loggedinUser = await _applicationUserManagerService.FindAsync(loginViewModel.Email, loginViewModel.Password); 
    if (loggedinUser != null) 
     await _applicationUserManagerService.UpdateSecurityStampAsync(loggedinUser.Id); 

    var result = await _signInManagerService.PasswordSignInAsync(loginViewModel.Email, loginViewModel.Password, loginViewModel.RememberMe, shouldLockout: true); 
    switch (result) 
    { 
     case Microsoft.AspNet.Identity.Owin.SignInStatus.Success: 
      return RedirectToLocal(returnUrl); 
     case Microsoft.AspNet.Identity.Owin.SignInStatus.Failure: 
      break; 
     case Microsoft.AspNet.Identity.Owin.SignInStatus.LockedOut: 
      break; 
     default: 
      return View(loginViewModel); 
    } 
    return View(loginViewModel); 
} 

但是我有一个问题,我必须通过授权Web ServiceCustomer,我不知道该怎么做到这一点。我可以使用ASP.NET Identity,还是我应该使用Session?

登录后可以更换页面,并且在每个页面中我必须从Web Services加载一些数据。

将数据放入cookie中安全吗?

回答

1

首先,您用于用户身份验证的Microsoft.AspNet.Identity.Owin.SignInManager只是一个超过Claim-Base Identity的外观。

要授权用户在应用程序中,您只需要创建ClaimsIdentity并运行AuthenticationManager.SignIn方法。

你的代码可以改变方式如下:

public virtual async Task<ActionResult> Login(LoginViewModel loginViewModel, string returnUrl) 
{ 
    ... 

    //try to authenticate user via login and password 
    var result = await _signInManagerService.PasswordSignInAsync(loginViewModel.Email, loginViewModel.Password, loginViewModel.RememberMe, shouldLockout: true); 
    switch (result) 
    { 
     ... 

     //try to authenticate customer via web-service 
     case Microsoft.AspNet.Identity.Owin.SignInStatus.Failure: 
      //proxy-class to access your web-service 
      CustomerServiceClient clientToService = new CustomerServiceClient(); 
      var customerData = clientToService.LoadCustomerData(loginViewModel.Email, loginViewModel.Password) 

      ... 

      ClaimsIdentity identity = CustomerIdentityHelper.CreateIdentity(customerData); 
      AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = loginViewModel.RememberMe}, identity); 
      break; 
     default: 
      return View(loginViewModel); 
    } 
} 

根据你的最后一个问题,在哪里存储用户数据,可以存储经常使用的要求,在默认情况下被加密并存储在cookie数据(如果基于cookie的认证中间件被添加到应用程序管道中)。但是这样的数据量不应该太大。否则,您可以使用会话或每次从服务中查询数据。

+0

谢谢。我只有一个问题。创建另一个登录表单不是更好吗?因为它可能是用户和获取成果结果,并以这种方式,我不需要检查Web服务。 –

+1

这取决于你将如何让用户进行身份验证。我刚刚写了如何以两种不同的方式授权用户和客户。何处使用此代码取决于您的应用程序需求和UI。 –

+0

对于最后一个问题,我如何才能限制客户'客户'专区?因为我不想让客户访问'Admin'区域? –