Аутентификация ASP.NET MVC Forms по внешнему веб-сервису - PullRequest
24 голосов
/ 12 апреля 2011

Я пытаюсь написать приложение ASP.NET MVC, которое является интерфейсом для нашей CRM и имеет веб-службу SOAP.Я хотел бы, чтобы пользователь входил в мое веб-приложение, используя свое имя пользователя и пароль CRM, а затем проходил аутентификацию в CRM, совершал вызовы веб-службы на страницах и т. Д.

Я начал изучать использование проверки подлинности с помощью форм и реализациинастраиваемый поставщик членства - я могу реализовать все методы, которые мне нравятся ValidateUser(), но у меня проблема в том, что после входа в веб-службу CRM вы получаете токен, который должен передаваться при каждом последующем вызове веб-службы, и я не уверен, где я могу хранить это.

Итак, мои вопросы:

  • - это способ проверки подлинности с помощью форм, или это будет более простым, чтобы обрабатывать всю проверку подлинности самостоятельно и сохранять токен в сеансе,
  • Если проверка подлинности с помощью форм - это путь, где и как я должен хранить дополнительную информацию, подобную этой.Кажется, нравится использовать проверку подлинности с помощью форм, но затем добавить дополнительную информацию (которая связана с проверкой подлинности) в файл cookie или сеанс за пределами этого, будет немного беспорядочно?

Любой совет был бы оценен

1 Ответ

36 голосов
/ 12 апреля 2011

Вы можете сохранить токен аутентификации в части userData куки аутентификации форм.Таким образом, он будет доступен при каждом запросе.

Так, например, когда вы проверяете учетные данные пользователя, вы можете запросить веб-службу для получения токена и вручную создать и отправить cookie проверки подлинности форм:

[HttpPost]
public ActionResult LogOn(string username, string password)
{
    // TODO: verify username/password, obtain token, ...
    // and if everything is OK generate the authentication cookie like this:

    var authTicket = new FormsAuthenticationTicket(
        2,
        username,
        DateTime.Now,
        DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes),
        false,
        "some token that will be used to access the web service and that you have fetched"
    );
    var authCookie = new HttpCookie(
        FormsAuthentication.FormsCookieName, 
        FormsAuthentication.Encrypt(authTicket)
    )
    {
        HttpOnly = true
    };
    Response.AppendCookie(authCookie);

    // ... redirect
}

Затем вы можете написать собственный атрибут авторизации, который будет считывать эту информацию и устанавливать собственный общий идентификатор:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthenticated = base.AuthorizeCore(httpContext);
        if (isAuthenticated) 
        {
            string cookieName = FormsAuthentication.FormsCookieName;
            if (!httpContext.User.Identity.IsAuthenticated ||
                httpContext.Request.Cookies == null || 
                httpContext.Request.Cookies[cookieName] == null)
            {
                return false;
            }

            var authCookie = httpContext.Request.Cookies[cookieName];
            var authTicket = FormsAuthentication.Decrypt(authCookie.Value);

            // This is where you can read the userData part of the authentication
            // cookie and fetch the token
            string webServiceToken = authTicket.UserData;

            IPrincipal userPrincipal = ... create some custom implementation
                                           and store the web service token as property

            // Inject the custom principal in the HttpContext
            httpContext.User = userPrincipal;
        }
        return isAuthenticated;
    }
}

Наконец, украсьте ваши контроллеры / действия, которые требуют аутентификации, с помощью этого атрибута:

[MyAuthorize]
public ActionResult Foo()
{
    // HttpContext.User will represent the custom principal you created
    // and it will contain the web service token that you could use to 
    // query the remote service
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...