String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();
Теперь, чтобы преобразовать массив символов в строку, есть два способа.
Arrays.toString(c);
Возвращает строку [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]
.
И:
String.valueOf(c)
Возвращает строку wwwwww3333dfevvv
.
В заключение : обратите внимание на Arrays.toString(c)
, потому что вы получите "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"
вместо "wwwwww3333dfevvv"
.
Спасибо всем за ваш вклад. Я остановился на подходе (по крайней мере, пока). Это довольно просто и хорошо работает для моих целей.
Используя clientCredentialType «UserName» и явный метод входа в службу, который возвращает токен безопасности (детали генерации токена опущены для краткости), клиент службы может решить, передавать ли подлинный пароль в качестве свойства пароля в учетных данных клиента или токена безопасности (полученного из метода входа в систему). Если клиент является веб-приложением, токен безопасности может храниться в билете проверки подлинности с помощью форм, сеансе или еще где-нибудь.
Используя «Custom» userNamePasswordValidationMode и настраиваемую реализацию UserNamePasswordValidator,
Я могу придумать два возможных решения:
Во-первых, если служба WCF является внутренней службой, веб-приложение может отправить имя пользователя, запрашивающего данные с каждым запросом.
Во-вторых, вы где-то храните имя пользователя и хэш пароля (или фактический пароль). Либо в состоянии сеанса, либо в файле cookie пользователя (файл cookie сеанса, хранящийся в памяти, передаваемый пользователю по https). Затем передавайте имя пользователя и пароль службе WCF с каждым запросом.
See my answer on Storing password in forms authentication cookie - ASP.NET and WCF calls for a solution that does not require storing passwords.
Это очень разумный подход.
Для этого вы настраиваете свою конечную точку службы и настраиваете ее с помощью своего настраиваемого поставщика членства (вы можете сделать то же самое с поставщиком членства SQL, он не требует настраиваемого).
В настроенном веб-приложении событие Authenticate элемента управления Login для создания экземпляра нового прокси службы и установки имени пользователя и пароля в ClientCredentials в прокси.
Теперь, когда вы выполняете вызов службы через прокси, WCF будет передавать эти учетные данные через безопасный канал к службе и использовать их для аутентификации.
Теперь вам просто нужно сохранить прокси в сеансе и использовать его для будущего доступа к службе, поскольку у него есть состояние канала и закрытый ключ.
protected void LoginControl_Authenticate(object sender, AuthenticateEventArgs e)
{
bool Authenticated = false;
try
{
MyServiceClient proxy = new MyServiceClient("MyServiceEndpoint");
proxy.ClientCredentials.UserName.UserName = LoginControl.UserName;
proxy.ClientCredentials.UserName.Password = LoginControl.Password;
//It doesn't really matter what is called or what it does because
//Membership Provider for the Service does the authentication.
string retval = proxy.login("Logging in");
//Now that channel is established the proxy needs to be kept
//since it contains the channel state which includes a private key
Session["MyServiceProxy"] = proxy;
Authenticated = true;
}
catch (Exception ex)
{
//Login Error...
}
e.Authenticated = Authenticated;
}
Я бы посоветовал взглянуть на Женева , который нацелен на решение сценариев, подобных вашему. Основная идея состоит в том, чтобы требовать один и тот же токен безопасности с помощью HttpModule как для служб WCF, так и для сайта ASP. Токен будет выпущен после аутентификации в вашей базе данных членства и может содержать полезную информацию (утверждения) о пользователе.
Для вступления вы можете прочитать статью Бустаманте .
У Microsoft есть служба WCF, которую вы можете использовать для аутентификации пользователей с членством в ASP.NET.
Код на самом деле встроен во фреймворк - вам просто нужно создать файл .svc, чтобы использовать его.