2015-04-24 5 views
0

Мне нужно аутентифицировать пользователя из центрального CAS. Предположение о том, таковы:.Net MVC 4 CAS Аутентификация

  1. UserId для аутентификации в заголовке запроса
  2. Роли для авторизации приведены на веб-службы.
  3. Приложение должно кэшировать фазу авторизации.

Я попытался это:

В Global.asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     const string SiteMinderHeaderToken = "SM_USER"; 
     if (HttpContext.Current.User == null || !HttpContext.Current.User.Identity.IsAuthenticated) 
     { 

      var userSSO = HttpContext.Current.Request.Headers[SiteMinderHeaderToken]; 
      GenericIdentity webIdentity = new GenericIdentity(userSSO, "SiteMinder"); 

      string[] roles = { "ROLE1", "ROLE2" }; 
      GenericPrincipal principal = new GenericPrincipal(webIdentity, roles); 
      HttpContext.Current.User = principal; 



      // System.Web.Security.FormsAuthentication.SetAuthCookie(userSSO, true); 

     } 
    } 

В Web.config

<authentication mode="None" /> 
<authorization> 
    <deny users="?" /> 
</authorization> 

Проблема в том, что для каждого запроса , HttpContext.Current.Userвсегда имеет значение, и каждый t Все операции аутентификации и авторизации завершены.

Если я раскомментировать

System.Web.Security.FormsAuthentication.SetAuthCookie(userSSO, true); 

Все нормально, после первого запроса пользователь проходит проверку подлинности.

Мои вопросы:

  1. ли правильно называть System.Web.Security.FormsAuthentication.SetAuthCookie, даже если там не FormAuthentication?
  2. Есть ли способ сделать это лучше?
  3. Существуют ли какие-либо проблемы с безопасностью?

Благодаря

ответ

0
  1. FormsAuthentication в этом случае просто хранения сеанса пользователя. Вот еще информация: Понимание Билетов аутентификации форм и файлов cookie https://support.microsoft.com/en-us/kb/910443/
  2. Вы можете установить auth cookie таким образом, но если вы хотите сохранить больше информации о пользователях в сеансе, я бы рекомендовал использовать претензии.
  3. Файлы cookie FormsAuthentication защищены. «Билет зашифрован и подписан с использованием элемента конфигурации файла Machine.config сервера. ASP.NET 2.0 использует decryptionKey и новый атрибут дешифрования элемента для шифрования билетов проверки подлинности». В приведенной выше ссылке есть дополнительная информация. Я думаю, единственной проблемой безопасности будет то, как пользователь обращается к вашему коду «FormsAuthentication.SetAuthCookie (userSSO, true)»;

Попробуйте найти аутентификацию Owin для хранения сеанса пользователей.

http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

Вот пример того, как я использую его в моем проекте MVC.

Установленные самородок пакеты:

  • Microsoft.Owin.Host.SystemWeb
  • Microsoft.Owin.Security.OAuth
  • Microsoft.Owin.Security.Cookies

Создан файл OwinConfig.cs (в папке App_Start):

using Microsoft.Owin; 

[assembly: OwinStartup(typeof(MyProject.OwinConfig))] 

namespace MyProject 
{ 
using System.Web.Security; 

using Microsoft.Owin.Security.Cookies; 

using Owin; 

/// <summary> 
/// The startup. 
/// </summary> 
public class OwinConfig 
{ 
    /// <summary> 
    /// The configuration. 
    /// </summary> 
    /// <param name="app"> 
    /// The app. 
    /// </param> 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = FormsAuthentication.FormsCookieName, 
      Provider = new CookieAuthenticationProvider() 
     }); 
    } 
} 
} 

код я использую для входа пользователя в систему:

var claims = new[] 
{ 
    new Claim(ClaimTypes.NameIdentifier, 1)), 
    new Claim("CustomClaim", "My bio or something"), 
    new Claim(ClaimTypes.Name, "set_username") 
}; 
var userWithClaims = new ClaimsIdentity(claims, FormsAuthentication.FormsCookieName); 
var owinContext = HttpContext.Current.Request.GetOwinContext(); 
var authenticationManager = owinContext.Authentication; 
authenticationManager.SignIn(userWithClaims); 

И тогда я доступ к сохраненным претензий путем создания класса IdentityExtensions.cs (также в моей папке app_start):

public static class IdentityExtensions 
{ 
    public static string GetCustomClaim(this IIdentity identity) 
    { 
     if (identity == null) 
     { 
      throw new ArgumentNullException("identity"); 
     } 

     var ci = identity as ClaimsIdentity; 
     return ci != null ? ci.FindFirstValue("CustomClaim") : null; 
    } 
    private static string FindFirstValue(this ClaimsIdentity identity, string claimType) 
    { 
     if (identity == null) 
     { 
      throw new ArgumentNullException("identity"); 
     } 

     var claim = identity.FindFirst(claimType); 
     return claim != null ? claim.Value : null; 
    } 
} 

Так что в моем контроллере я мог только позвонить:

string customClaim = this.HttpContext.User.Identity.GetCustomClaim(); 

Тогда, наконец, выйти из системы Я хотел бы использовать:

var owinContext = HttpContext.Current.Request.GetOwinContext(); 
var authenticationManager = owinContext.Authentication; 
authenticationManager.SignOut(); 
+0

Спасибо, хороший формат и данные, но, кажется, немного не по теме, подальше от моих вопросов. – Guaido79

+1

1. FormsAuthentication - это просто сохранение сеанса. 2. Мой путь выше - лучший способ хранения сеанса с дополнительными данными. 3. FormsAuthentication хранит зашифрованный файл cookie, поэтому он безопасен. –

Смежные вопросы